C 使用正則匹配

2021-10-09 03:24:28 字數 4528 閱讀 8520

答案肯定是可以的,那麼,今天乙個簡單的輸入scanf帶你走進正則的世界

#include

intmain()

在scanf時輸入任何一串以數字開始的字元,那麼str裡面只會儲存字元裡面的第一串數字

input digate:

123456abc

123456

先給出一些簡單的正則

限定符含義

%[0-9]

數字集合

%[^0-9]

非數字集合

%[a-za-z]

字母集合

%[^a-za-z]

非字母集合

預熱好了,正題開始…

判斷步驟:

長度大於5,小於等於11;

首位不能為0;

是否為純數字?

c++string處理:

#include

using namespace std;

intmain()

} cout <<

"存在"

<< endl;

}else

}else

return0;

}

雖然功能實現了但是非常麻煩

正則處理:

#include

#include

using namespace std;

intmain()

"); string qq =

"746632063"

; smatch result;

bool ret =

regex_match

(qq, result, qq_reg)

; cout <<

(ret ?

"存在"

:"不存在"

)<< endl;

return0;

}

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

是不是很方便呢?那麼接下來便來看看如何使用「正規表示式」。

「正規表示式」就是一套表示規則的式子,專門用來處理各種複雜的操作。

std::regex是c++用來表示「正規表示式」(regular expression)的庫,於c++11加入,它是class std::basic_regex<>針對char型別的乙個特化,還有乙個針對wchar_t型別的特化為std::wregex。

std::regex預設使用是ecmascript文法,這種文法比較好用,且威力強大,常用符號的意義如下:

符號意義

^匹配行的開頭

$匹配行的結尾

.匹配任意單個字元

[…]匹配中的任意乙個字元

(…)設定分組

\轉義字元

\d匹配數字[0-9]

\d\d 取反

\w匹配字母[a-z],數字,下劃線

\w\w 取反

\s匹配空格

\s\s 取反

+前面的元素重複1次或多次

*前面的元素重複任意次

?前面的元素重複0次或1次

前面的元素重複n次

前面的元素重複至少n次

前面的元素重複至少n次,至多m次

|邏輯或

上面列出的這些都是非常常用的符號,靠這些便足以解決絕大多數問題了。

字串處理常用的乙個操作是「匹配」,即字串和規則恰好對應,而用於匹配的函式為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

#include

using namespace std;

intmain()

$");//1開頭,後面[3578]中的乙個,九個數字

string s =

"17779637570"

; smatch result;

bool ismatch =

regex_match

(s, result, pattern);if

(ismatch)

else

cout <<

"匹配失敗"

<< endl;

return0;

}

匹配成功:17779637570
匹配成功並返回匹配到的結果「搜尋」與「匹配」非常相像,其對應的函式為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

#include

using namespace std;

intmain()

return0;

}

查詢成功:51

查詢結果子串的在源串中的迭代器位置5

查詢結果子串的在源串後面的位置x

查詢成功:41

查詢結果子串的在源串中的迭代器位置4

查詢結果子串的在源串後面的位置+

查詢成功:5

查詢結果子串的在源串中的迭代器位置5

查詢結果子串的在源串後面的位置-

查詢成功:13

查詢結果子串的在源串中的迭代器位置1

查詢結果子串的在源串後面的位置/

查詢成功:2

查詢結果子串的在源串中的迭代器位置2

查詢結果子串的在源串後面的位置)

查詢成功:3

查詢結果子串的在源串中的迭代器位置3

查詢結果子串的在源串後面的位置a

最後一種操作稱為「替換」,即將正規表示式內容替換為指定內容,regex庫用模板函式std::regex_replace提供「替換」操作。

string regex_replace

(string s,regex p,string replace_str)

//有其他過載用法

現在,給定乙個資料為"he…ll…o, worl…d!", 思考一下,如何去掉其中誤敲的「.」?

#include

#include

using namespace std;

intmain()

hello, world!
刪除了沒必要的點,是不是賊方便…

對字串data中與模式匹配的所有子串進行相應的字串替換,替換字串引用匹配子串中的內容,引用方法如下

轉義序列

替換為$n

匹配第n個捕捉組的字串。例如$l表示第乙個捕捉組,$2表示第二個,依此類推

$&匹配整個正規表示式的字串,等同於$0

$`在源字串中,在匹配正規表示式的子字串左側的部分

$』在源字串中,在匹配正規表示式的子字串右側的部分

$$美元符號

#include

#include

using namespace std;

intmain()

001 name=neo,002 name=lucia

C的正則匹配

reg icase即可。另外還要注意正規表示式中如果要包括 那麼把它寫在最後,或最前,否則會當成a z這種範圍來計算的,regcomp編譯無法通過,會提示 nvalid range end 當然這個資訊要通過regerror 來獲取。下面附上可用的 include include include i...

正則匹配 preg replace 函式使用

preg replace 函式執行乙個正規表示式的搜尋和替換。語法mixed preg replace mixed pattern mixed replacement mixed subject int limit 1 int count 搜尋 subject 中匹配 pattern 的部分,以 r...

使用正則匹配去除重複字段

正規表示式這個語法以簡單高效著稱,但是有一點i就是比較複雜。近期有個功能需要去除字串中重複的部分,由於使用正常的傳統的那種舒服拆分成陣列在乙個乙個匹配的方式感覺有點效率過低浪費效能,於是便想到了正規表示式來匹配重複的字串,並利用string自導的replaceall方法來將相應的字串給刪除掉。目標字...