c 正規表示式

2021-09-06 23:02:52 字數 2150 閱讀 2745

正規表示式是經常使用的一種方法。比較有名的類庫是boost,可是這個類庫在重了。全部就像找一些輕量級的類庫。

後來發現準標準的庫tr1已經非常方便了,微軟vs2008 sp1 以上版本號都支援了。全部就直接用它非常方便了。

並且支援unicode編碼,還是非常方便的。

樣例:#include

#include

#include

int _tmain(int argc, _tchar* argv)  

[**說明]

1. 建立正規表示式物件,有3中方法:

(1) 使用建構函式

std::regex_constants::syntax_option_type fl = std::regex_constants::icase; // 語法選項,能夠設定使用哪種風格的正規表示式語法等.

std::wregex regexpress(regstring, fl);

(2) 使用賦值運算子,缺點是不能指定語法選項,並且也比較低效.

std::wregex regexpress;

regexpress = regstring;

(3) 使用assign方法.

std::wregex regexpress;

regexpress.assign(regstring, fl);

構造正則物件的過稱就是所謂的"編譯".

2. regex_match() 和 regex_search()

regex_match()僅僅有在整個字串匹配正規表示式時才返回 true, 而 regex_search()在子串匹配就返回 true.

3. 匹配結果物件 std::wsmatch.

熟悉perl正規表示式的人都知道,匹配成功後能夠用 $1 $2 ... $n 來獲得子串的指, tr1 regex庫把匹配結果儲存在乙個 std::wsmatch(unicode) / std::smatch(ansi) 物件中.

std::wsmatch 是乙個由若干個 std::wssub_match 物件構成的陣列. 而 std::wssub_match 派生自 pair.

由std::wssub_match::first儲存子串的起始位置指標(事實上說是迭代器比較準確一點).

由std::wssub_match::second儲存子串的結束位置 +1 的指標(stl的通用原則,半開區間).

所以 [std::wssub_match::first,std::wssub_match::second) 就是子串的所有內容.

當然, std::wsmatch (match_result模版的提前定義類) 提供了一些簡便的方法用於訪問子串:

(1) str(idx) 方法返回相應的子串的 std::string / std::wstring 物件. 僅僅是最經常使用的.

(2) position(idx) 方法返回相應子串的起始偏移量.(不是指標,是相對於首位元組位址或者begin()的偏移量).

(3) length(idx) 返回子串的長度.

4. 替換子串.

前面說到 std::wssub_match::first / second 儲存了子串的起始/結束位置,那麼我們當然能夠用這個指標(迭代器)來替換文字(見**中的 "替換1").

或者用 std::regex_replace() 也能夠達到目的(見**中的"替換2").

幾個經常使用的表示式:

"\\b1[35][0-9]\\d|147\\d|1[8][01236789]\\d\\b";//手機號

"\\b0\\d\\-?\\d\b"; //座機

"\\b[1-9]\\d(?:19|20)\\d(?:0[1-9]|[1][012])(?#月)(?:0[1-9]|[12][0-9]|[3][01])(?#日)\\d[\d|x|x]\\b"; //18位身份證

"\\b[1-9]\\d(?:0[1-9]|[1][012])(?#月)(?:0[1-9]|[12][0-9]|[3][01])(?#日)\\d\\b"; //15位身份證

"\\b(?:(?:2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.)(?:2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\b";  //ip4

"\\b(?:[a-za-z0-9_-])+@(?:[a-za-z0-9_-])+(?:\\.[a-za-z0-9_-])\\b"; //郵箱

C 正規表示式

c 中的正規表示式 1 c 中的正規表示式 jeffrey e.f.friedl寫了一本關於正規表示式的書 精通正規表示式 作者為了使讀者更好的理解和掌握正規表示式,編造了乙個故事。該書的語言以perl為主。據我所知c 中的正規表示式也是基於perl5。所以它們應該有許多的共同之處。其實,我並不打算...

C 正規表示式

正規表示式 元字元 匹配任何單個字元,匹配括號內的任何乙個字元,改變優先順序,定義提取組,將兩個匹配條件進行邏輯或運算,匹配0至多個它之前的子表示式,和萬用字元 沒關係,匹配前面的子表示式一次或多次,匹配前面的子表示式零次或一次,匹配前面表示式確定的n次,匹配前面表示式至少n次,匹配前面表示式n到m...

C 正規表示式

正規表示式元字元 1 中括號 用來描述匹配規則,乙個中括號只能匹配乙個字元 2 小括號 用來描述匹配的字串,乙個小括號表示匹配一段字串 3 大括號 用來描述匹配的具體數量 4 s 用於匹配單個空格符,包括tab鍵和換行符 5 s 用於匹配除單個空格符之外的所有字元 6 d 用於匹配從0到9的數字 7...