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 類,將正...