C/C++能夠用正則表達式嗎?


點擊藍字 關注咱們ios



C/C++能夠用正則表達式嗎?

答案確定是能夠的,那麼,今天一個簡單的輸入scanf帶你走進正則的世界web

#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

先給出一些簡單的正則express

限定符 含義
%[0-9] 數字集合
%[^0-9] 非數字集合
%[a-zA-Z] 字母集合
%[^a-zA-Z] 非字母集合

預熱好了,正題開始...編程

若要判斷一個輸入的QQ號是否有效,如何判斷?

判斷步驟:微信

  1. 長度大於5,小於等於11;
  2. 首位不能爲0;
  3. 是否爲純數字?

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;
}

雖然功能實現了可是很是麻煩app

正則處理:

#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;
}

笑出了豬叫,一行正則匹配就解決了編輯器

是否是很方便呢?那麼接下來便來看看C++如何使用正則表達式函數

正則程序庫(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

正則在C/C++裏面還有其餘應用嗎?

答案毋庸置疑,有的,在Linux操做系統中正則表達式經常使用來查找文本里面指定的內容,若是閱讀量可觀,後期還會發布Linxu下字符串匹配查找grep詳細使用實戰

正則表達式更爲詳細的講解在下面兩篇推送中,Python的,能夠看下正則匹配元字符,另外這個號主文章寫得不錯,能夠點點關注。

那麼這期就到這裏,週末見..

關鍵字【正則表達式】


End



做者:夢凡

夢想在,終不凡~

大家的在看就是對我最大的確定,
點個在看好嗎~

本文分享自微信公衆號 - 編程學習基地(LearnBase)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索