網站首頁 編程語言 正文
C/C++可以用正則表達式嗎?
答案肯定是可以的,那么,今天一個簡單的輸入scanf帶你走進正則的世界
#include<stdio.h>
int main()
{
?? ?printf("input digate:");
?? ?char str[100];
?? ?scanf("%[0-9]", str);?? ?//輸入123456abc
?? ?printf("%s", str);?? ??? ?//打印123456
}
在scanf時輸入任何一串以數字開始的字符,那么str里面只會保存字符里面的第一串數字
input digate:123456abc
123456
先給出一些簡單的正則
限定符 | 含義 |
---|---|
%[0-9] | 數字集合 |
%[^0-9] | 非數字集合 |
%[a-zA-Z] | 字母集合 |
%[^a-zA-Z] | 非字母集合 |
預熱好了,正題開始…
若要判斷一個輸入的QQ號是否有效,如何判斷?
判斷步驟:
- 長度大于5,小于等于11;
- 首位不能為0;
- 是否為純數字?
C++string處理:
#include<iostream>
using namespace std;
int main()
{
string qq = "7466a2063";
if (qq.length() >= 5 && qq.length() <= 11)
{
// 2. 判斷是否非'0'開頭
if (qq[0] != '0')
{
// 3. 判斷是否為純數字
for each (char var in qq)
{
cout << var;
if (var < '0' || var > '9')
{
cout << "不存在" << endl;
return 0;
}
}
cout << "存在" << endl;
}
else
{
cout << "不存在" << endl;
}
}
else
{
cout << "不存在" << endl;
}
return 0;
}
雖然功能實現了但是非常麻煩
正則處理:
#include<iostream>
#include<regex>
using namespace std;
int main()
{
?? ?regex qq_reg("[1-9]\\d{4,11}");
?? ?string qq = "746632063";
?? ?smatch result;
?? ?bool ret = regex_match(qq, result, qq_reg);
?? ?cout << (ret ? "存在" : "不存在") << endl;
?? ?return 0;
}
笑出了聲,一行正則匹配就解決了
是不是很方便呢?那么接下來便來看看如何使用「正則表達式」。
正則程序庫(regex)
「正則表達式」就是一套表示規則的式子,專門用來處理各種復雜的操作。
std::regex是C++用來表示「正則表達式」(regular expression)的庫,于C++11加入,它是class std::basic_regex<>針對char類型的一個特化,還有一個針對wchar_t類型的特化為std::wregex。
正則文法(regex syntaxes)
std::regex默認使用是ECMAScript文法,這種文法比較好用,且威力強大,
常用符號的意義如下:
符號 | 意義 |
---|---|
^ | 匹配行的開頭 |
$ | 匹配行的結尾 |
. | 匹配任意單個字符 |
[…] | 匹配[]中的任意一個字符 |
(…) | 設定分組 |
\ | 轉義字符 |
\d | 匹配數字[0-9] |
\D | \d 取反 |
\w | 匹配字母[a-z],數字,下劃線 |
\W | \w 取反 |
\s | 匹配空格 |
\S | \s 取反 |
+ | 前面的元素重復1次或多次 |
* | 前面的元素重復任意次 |
? | 前面的元素重復0次或1次 |
{n} | 前面的元素重復n次 |
{n,} | 前面的元素重復至少n次 |
{n,m} | 前面的元素重復至少n次,至多m次 |
| | 邏輯或 |
上面列出的這些都是非常常用的符號,靠這些便足以解決絕大多數問題了。
匹配(Match)
字符串處理常用的一個操作是「匹配」,即字符串和規則恰好對應,而用于匹配的函數為std::regex_match(),它是個函數模板
bool regex_match(string s,regex pattern)
bool regex_match(string s,smatch result,regex pattern)
bool regex_match(s.cbegin()+i,s.cend(),smatch result,regex pattern) ?//從字符串的某個位置開始匹配?
我們直接來看例子:
#include<iostream>
#include<regex>
using namespace std;
int main()
{
/*匹配*/
regex pattern("^1[3578]\\d{9}$"); //1開頭,后面[3578]中的一個,九個數字
string s = "17779637570";
smatch result;
bool ismatch = regex_match(s, result, pattern);
if (ismatch)
{
cout << "匹配成功:" << result[0] << endl;
}
else
cout << "匹配失敗" << endl;
return 0;
}
匹配成功:17779637570
匹配成功并返回匹配到的結果
搜索(Search)
「搜索」與「匹配」非常相像,其對應的函數為std::regex_search,也是個函數模板,用法和regex_match一樣,不同之處在于「搜索」只要字符串中有目標出現就會返回,而非完全「匹配」。
bool regex_search(string s,regex pattern)
bool regex_search(string s,smatch result,regex pattern)
bool regex_search(s.cbegin()+i,s.cend(),smatch result,regex pattern) ?//從字符串的某個位置開始匹配?
搜索給定字符串中是否存在與模式匹配的子串,如果存在則返回true。
同樣可以用smatch result記錄結果,但不同的是result[0]記錄的是整個字符串中從左往右第一個匹配模式的子串。
假如有多個子串符合模式,若想知道result[0]中存儲的是第幾個子串,可以用result.position()函數,返回數從0開始。
我們直接來看例子:
#include<iostream>
#include<regex>
using namespace std;
int main()
{
regex pattern("\\d+"); /*匹配一個到無窮個數字*/
string s = "51x41+(5-13/2)x3a";
smatch result;
string::const_iterator iter_begin = s.cbegin();
string::const_iterator iter_end = s.cend();
while (regex_search(iter_begin, iter_end, result, pattern))
{
cout << "查找成功:" << result[0] << endl;
cout << "查找結果子串的在源串中的迭代器位置" << *result[0].first << endl;
cout << "查找結果子串的在源串后面的位置" << *result[0].second << endl;
iter_begin = result[0].second; //更新迭代器位置
}
return 0;
}
查找成功:51
查找結果子串的在源串中的迭代器位置5
查找結果子串的在源串后面的位置x
查找成功:41
查找結果子串的在源串中的迭代器位置4
查找結果子串的在源串后面的位置+
查找成功:5
查找結果子串的在源串中的迭代器位置5
查找結果子串的在源串后面的位置-
查找成功:13
查找結果子串的在源串中的迭代器位置1
查找結果子串的在源串后面的位置/
查找成功:2
查找結果子串的在源串中的迭代器位置2
查找結果子串的在源串后面的位置)
查找成功:3
查找結果子串的在源串中的迭代器位置3
查找結果子串的在源串后面的位置a
替換(Replace)
最后一種操作稱為「替換」,即將正則表達式內容替換為指定內容,regex庫用模板函數std::regex_replace提供「替換」操作。
string regex_replace(string s,regex p,string replace_str)?? ?//有其他重載用法
現在,給定一個數據為"he…ll…o, worl…d!", 思考一下,如何去掉其中誤敲的“.”?
#include<iostream>
#include<regex>
using namespace std;
int main()
{
?? ?char data[] = "he...ll..o, worl..d!";
?? ?regex reg("\\.");?? ?//正則匹配點.
?? ?cout << regex_replace(data, reg, "");?? ?//將正則匹配到的點替換成無,即刪除點
?? ?return 0;
}
hello, world!
刪除了沒必要的點,是不是賊方便…
對字符串data中與模式匹配的所有子串進行相應的字符串替換,替換字符串引用匹配子串中的內容,引用方法如下
轉義序列 | 替換為 |
---|---|
$n | 匹配第n個捕捉組的字符串。例如$l表示第一個捕捉組,$2表示第二個,依此類推 |
$& | 匹配整個正則表達式的字符串,等同于$0 |
$` | 在源字符串中,在匹配正則表達式的子字符串左側的部分 |
$’ | 在源字符串中,在匹配正則表達式的子字符串右側的部分 |
$$ | 美元符號 |
#include<iostream>
#include<regex>
using namespace std;
int main()
{
char data[] = "001-Neo,002-Lucia";
regex reg("(\\d+)-(\\w+)");
cout << regex_replace(data, reg, "$1 name=$2");
return 0;
}
001 name=Neo,002 name=Lucia
原文鏈接:https://blog.csdn.net/qq_44519484/article/details/107965931
相關推薦
- 2022-10-11 ArrayList源碼中的MAX_ARRAY_SIZE
- 2022-05-27 react使用axios進行api網絡請求的封裝方法詳解_React
- 2022-11-11 python?使用第三方庫requests-toolbelt?上傳文件流的示例_python
- 2023-07-14 echarts圖表進度條類型圖
- 2022-07-11 Python標準庫uuid模塊(生成唯一標識)詳解_python
- 2023-04-06 python中注釋用法簡單示例_python
- 2022-03-14 golang實現子網掩碼和網絡位長度相互轉換
- 2022-07-30 Python?excel合并居中值相同的單元格實例代碼_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支