C 11 正規表示式

2021-08-15 07:07:17 字數 4187 閱讀 5783

0.常用正規表示式

中文字元:[\u4e00-\u9fa5]

雙位元組字元(包括漢字在內):[^\x00-\xff]

空白符:\n\s*\r

國內**號碼:\d-\d|\d-\

18位身份證號:^(\d)(\d)(\d)(\d)(\d)([0-9]|x)$

(年-月-日)格式日期:([0-9][1-9]|[0-9][1-9][0-9]|[0-9][1-9][0-9]|[1-9][0-9])-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))

正整數:^[1-9]\d*$

負整數:^-[1-9]\d*$

整數:^-?[1-9]\d*$

非負整數:^[1-9]\d*|0$

非正整數:^-[1-9]\d*|0$

正浮點數:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$

負浮點數:^-[1-9]\d*\.\d*|-0\.\d*[1-9]\d*$

1、概述

這裡主要介紹的是c++正規表示式庫(

re庫),re庫定義在標頭檔案regex中,包含多個元件。

簡要介紹如下:

regex                      表示有乙個正規表示式的類

regex_match          將乙個字串行與乙個正規表示式匹配

regex_search         尋找第乙個與正規表示式匹配的子串行

regex_replace       使用給定格式替換乙個正規表示式

sregex_iterator     迭代器介面卡,呼叫regex_search來遍歷乙個string中所有匹配的子串

smatch                   容器類,儲存在string中的搜尋的結果

ssub_match            string中匹配的子表示式的結果

2、例項1--查詢違反規則的單詞

規則:i在e之前,除非在c之後。

2.1 使用

regex_search

--

只輸出

第乙個匹配結果

#include #include #include using namespace std;

int main()

2.2 使用

sregex_iterator

--

輸出所有

匹配結果

在for迴圈中,當我們定義it時,sregex_iterator的構造函式呼叫regex_serch將

it定位到輸入中第乙個與r匹配的位置,而end_it是乙個空sregex_iterator,

起到尾後迭代器的作用。

程式源**如下:

#include #include #include using namespace std;

int main()

2.3

輸出匹配結果的上下文

匹配結果

smatch中有兩個名為

prefix

suffix的成員,分別返回表示輸入序列中當前匹配之前和之後部分的

ssub_match物件。

程式源**如下:

#include #include #include using namespace std;

int main()

return 0;

}

3.例項2--匹配**號碼(有多種格式)

3.1

子表示式

這裡要使用正規表示式中的

子表示式,正規表示式語法通常

用括號表示子表示式。

舉例:regex r("([[:alnum:]]+)\\.(cpp|cxx|cc)$");

包含兩個子表示式:

如下**就可以只輸出檔名,而不輸出字尾:

if (regex_search(filename, results, r))

cout << results.str(1) << endl

第乙個子匹配

位置為0,

表示整個模式對應的匹配,隨後是每個

子表示式對應的匹配。

例如,如果檔名為foo.cpp,則results.str(0)將儲存foo.cpp;results.str(1)將儲存foo;而results.str(2)將儲存cpp。

3.2 使用子表示式進行資料驗證

整個正規表示式包含七個子表示式:(ddd)分隔符ddd分隔符dddd

子表示式1、3、4和6是可選的;2、5和7儲存號碼

"(\\()?(\\d)(\\))?([-. ])?(\\d)([-. ])?(\\d)";

1.(\\()?表示區號部分可選的左括號

2.(\\d)表示區號

3.(\\))表示區號部分可選的右括號

4.([-. ])?表示區號部分可選的分隔符

5.(\\d)表示號碼的下三位數字

6.([-. ])?表示可選的分隔符

7.(\\d)表示號碼的最後四位數字

完整的**如下:

#include #include #include using namespace std;

bool valid(const smatch& m)

int main()

)(\\))?([-. ])?(\\d)([-. ])?(\\d)");

regex r(phone,regex::icase);

smatch m;

//輸入

string s;

while (getline(cin, s))

return 0;

}

3.3 使用

regex_replace

將美國的**號碼轉換為"ddd.ddd.dddd"的形式

我們用乙個

符號$後跟子表示式的索引號來表示乙個特定的子表示式:

string fmt = "$2.$5.$7";  //將號碼格式改為ddd.ddd.dddd

源**如下:

#include #include #include using namespace std;

int main()

)(\\))?([-. ])?(\\d)([-. ])?(\\d)");

regex r(phone,regex::icase);

//輸入

string s;

string fmt("$2.$5.$7");

while (getline(cin, s))

cout << regex_replace(s,r,fmt) << endl;

}

輸入:

(908) 555-1800

輸出:908.555.1800

文章參考:

1. 2.

C 11正規表示式

優勢 使得字串的處理更加簡單 一些相關的操作 驗證 檢查字串是否是想要的合法性 決策 判斷乙個輸入標書哪種字串 解析 從輸入的字串中查詢自己想要的資訊 轉換 搜尋字串,並將字串替換為新的格式化的字串 遍歷 搜尋字串所有出現的地方 符號化 根據一組分隔符將乙個字串分解為多個子字串 一些重要術語 模式 ...

c 11 正規表示式

include include 正規表示式標頭檔案 using namespace std regex search 檢索 regex replace 將檢索到的物件進行替換替換 match 是否匹配 void main cout 正規表示式實現字串的替換 void main 匹配時間 void m...

C 11 正規表示式

1 驗證整個字串是否符合給定正規表示式 2 在字串中查詢符合給定正規表示式的子串 3 在字串中查詢符合正規表示式的子串,並替換 上述三點分別對應c 11中的三個函式,包含標頭檔案 include 使用函式std regex match 一般都是分三步 1 定義正規表示式 std regex 類,將正...