1.正則表達(dá)式筆記
必須記住的幾個(gè)符號和組合
. 匹配除換行符以外的所有字符一次
? 匹配 0 次或一次
* 匹配 0 次或多次
+ 匹配 1 次或多次
使用范例:
x? 匹配 0 次或一次 x 字符串
x* 匹配 0 次或多次 x 字符串,但匹配可能的最少次數(shù),*必須跟隨一個(gè)字符后面,不能單獨(dú)出現(xiàn)
x+ 匹配 1 次或多次 x 字符串,但匹配可能的最少次數(shù),+必須跟隨一個(gè)字符后面,不能單獨(dú)出現(xiàn)
.* 匹配 0 次或一次的任何字符
.+ 匹配 1 次或多次的任何字符
界定范圍和位置
^ 匹配字符開頭的字符
$ 匹配字符結(jié)尾的字符
{m} 匹配剛好是 m 個(gè) 的指定字符串
{m,n} 匹配在 m個(gè) 以上 n個(gè) 以下 的指定字符串
{m,} 匹配 m個(gè) 以上 的指定字符串
[] 匹配符合 [] 內(nèi)的字符
[^] 匹配不符合 [] 內(nèi)的字符
[0-9] 匹配所有數(shù)字字符
[a-z] 匹配所有小寫字母字符
[^0-9] 匹配所有非數(shù)字字符
[^a-z] 匹配所有非小寫字母字符
\b 匹配以英文字母,數(shù)字為邊界的字符串
\d 匹配一個(gè)數(shù)字的字符,和 [0-9] 語法一樣
\w 英文字母或數(shù)字的字符串,和 [a-zA-Z0-9] 語法一樣
\s 空格,和 [\n\t\r\f] 語法一樣
\B 匹配不以英文字母,數(shù)值為邊界的字符串
\D 非數(shù)字,其他同 \d
\S 非空格,和 [^\n\t\r\f] 語法一樣
\W 非英文字母或數(shù)字的字符串,和 [^a-zA-Z0-9] 語法一樣
a|b|c 匹配符合a字符 或是b字符 或是c字符 的字符串
abc 匹配含有 abc 的字符串
轉(zhuǎn)義: 使用\ 來取消元字符的特殊意義。包括 . * + \ [ ] { } ( ) ^ $
?的多重定義-懶惰限定符
*? 重復(fù)任意次,但盡可能少重復(fù)
+? 重復(fù)1次或更多次,但盡可能少重復(fù)
?? 重復(fù)0次或1次,但盡可能少重復(fù)
{n,m}? 重復(fù)n到m次,但盡可能少重復(fù)
{n,}? 重復(fù)n次以上,但盡可能少重復(fù)
斷言匹配: 有4個(gè)
(?=exp) 零寬先行斷言,它匹配文本中的某些位置,這些位置的后面能匹配給定的后綴exp。
比如/b/w+(?=ing/b),匹配以ing結(jié)尾的單詞的前面部分(除了ing以外的部分),
zc:根據(jù)后綴匹配而已。和$區(qū)別在于$是行尾匹配。
如I'm singing while you're dancing. 它會(huì)匹配sing和danc。
(?<=exp) 零寬后行斷言,它匹配文本中的某些位置,這些位置的前面能給定的前綴匹配exp。
如(?<=\bre)\w+\b會(huì)匹配以re開頭的單詞的后半部分(除了re以外的部分),
zc:匹配前綴。
例如在查找reading a book時(shí),它匹配ading。
(?!exp) 零寬負(fù)向先行斷言。會(huì)匹配后綴exp不存在的位置。
zc: 若不是exp或者沒有則匹配,用^在于存在一個(gè)不匹配某個(gè)exp的其他字符,而!保證不匹配exp外可以不跟任何字符。
如:\d{3}(?!\d)匹配三位數(shù)字,而且這三位數(shù)字的后面不能是數(shù)字。 也可以是只有前3位數(shù)字。比較\d{3}(^\d)有區(qū)別.
(?<!exp) 零寬負(fù)向后行斷言。查找前綴exp不存在的位置.
條件匹配: (zc:這個(gè)復(fù)雜,但也不復(fù)雜。屬于perl中的擴(kuò)展部分,略)
Conditional Expressions
(?(condition)yes-pattern|no-pattern)
attempts to match yes-pattern if the condition is true, otherwise attempts to match no-pattern.
(?(condition)yes-pattern) attempts to match yes-pattern if the condition is true, otherwise fails.
condition may be either a forward lookahead assert, or the index of a marked sub-expression
(the condition becomes true if the sub-expression has been matched).
2. boost中分有match,search,replace,在vc中,其正則表達(dá)式以上\表示需要雙反斜杠表示。其中在
match是匹配整個(gè)句子,在實(shí)際應(yīng)用中,必須是構(gòu)造整個(gè)句子的正則表達(dá),而在一篇文章匹配的話,以search用的
比較多,如下見一個(gè)片段。沒有用到std,可見用boost在匹配查詢時(shí),其比較麻煩:
void test123()
{
CString str = "singing while youre dancing.";
regex ee_all("\\b\\w+\\b");
cmatch result;
CString ret;
while(regex_search(str, result, ee_all,match_perl)){
for(int i=0; i < result.size(); i++){
ret = result[i].str().c_str();
AfxMessageBox(ret);
str = result[i].second;
}
}
}