語(yǔ)法:??,*?,+?,{n}?,{n,m}?
涵義:簡(jiǎn)單說(shuō),后面的這個(gè)?(lazy符)告訴正則引擎,它前面的表達(dá)式匹配到最短的匹配項(xiàng)就不用匹配下去了,如??,?本身匹配0-1個(gè)匹配項(xiàng),那么??就取最短的,匹配0個(gè)項(xiàng)就不匹配下去了,同理,*?匹配0個(gè),+?匹配1個(gè),{n}?匹配n個(gè),{n,m}?匹配n個(gè)。當(dāng)用@”/w*?”匹配”abcd”時(shí),會(huì)有五次成功匹配,每次都匹配的結(jié)果都是空字符串,為什么會(huì)是5次呢,這是因?yàn)檎齽t引擎在匹配一個(gè)表達(dá)式時(shí)是一個(gè)字符一個(gè)字符對(duì)比下去的,每成功匹配一次,就前進(jìn)一下。
判斷表達(dá)式
語(yǔ)法:
1、a|b,這個(gè)是最基本的,a或者b,其實(shí)這個(gè)不能算判斷
2、(?(expression)yes-expression|no-expression),其中no-expression為可選項(xiàng),意為,如果expression成立,則要求匹配yes-expression,否則要求匹配no-expression
3、(?(group-name)yes-expressioin|no-expression),其中no-expression為可選項(xiàng),意為,如果名為group-name的組匹配成功,則要求匹配yes-expression,否則要求匹配no-expression
判斷表達(dá)式還是很好理解的,唯有一點(diǎn)要注意:@"(?(a)a|b)"不能匹配"aa",為什么呢?要怎么樣寫才能匹配呢,大家先想想……
我們應(yīng)該這樣寫regex: @”(?(a)aa|b)”,請(qǐng)注意,判斷式中的內(nèi)容并不會(huì)做為yes-expression或no-expression表達(dá)式的一部分。
.net 的正則引擎工作特點(diǎn)
.net的正則引擎工作方式大多數(shù)和我們“想當(dāng)然”的方式一樣,只是有幾點(diǎn)要注意:
1、.net framework 正則表達(dá)式引擎盡可能的匹配多的字符(貪婪)。正是由于這一點(diǎn),所以,不要用@"<.*>(.*)</.*>"這樣的正則式來(lái)試圖找出一個(gè)html文檔中的所有innertext。(我也正是在網(wǎng)上看到有人這樣寫正則式才決定要寫《正則表達(dá)式 高級(jí)技巧》的,呵呵)
2、.net framework 正則表達(dá)式引擎是回溯的正則表達(dá)式匹配器,它并入了傳統(tǒng)的非確定性有限自動(dòng)機(jī) (nfa) 引擎(例如 perl、python使用的引擎)。這使其有別于更快的、但功能更有限的純正則表達(dá)式確定性有限自動(dòng)機(jī) (dfa) 引擎。.net framework 正則表達(dá)式引擎盡量匹配成功,所以,當(dāng)@"/w+/.(.*)/./w+"中的.*把www. .csdn.net中的.csdn.net都匹配完了,讓后面的/./w+沒(méi)得字符去匹配時(shí),引擎會(huì)進(jìn)行回溯,以得到成功的匹配。
net framework 正則表達(dá)式引擎還包括了一組完整的語(yǔ)法,讓程序員能夠操縱回溯引擎。包括:
“惰性”限定符:??、*?、+?、{n,m}?。這些惰性限定符指示回溯引擎首先搜索最少數(shù)目的重復(fù)。與之相反,普通的“貪婪的”限定符首先嘗試匹配最大數(shù)目的重復(fù)。
從右到左匹配。這在從右到左而非從左到右搜索的情況下十分有用,或者在從模式的右側(cè)部分開始搜索比從模式的左側(cè)部分開始搜索更為有效的情況下十分有用。
3、.net framework 正則表達(dá)式引擎在(expression1|expression2|expression3)這樣情況下,expression1總是最先得到嘗試,再依次是expression2和expression3
publicstaticvoidmain()
{
strings="thinisaasp.netdeveloper.";
regexreg=newregex(@"(/w{2}|/w{3}|/w{4})",regexoptions.compiled|regexoptions.ignorecase);
matchcollectionmc=reg.matches(s);
foreach(matchminmc)
console.writeline(m.value);
console.readline();
}
輸出結(jié)果是: ‘th’ ‘in’ ‘is’ ‘a(chǎn)s’ ‘ne’ ‘de’ ‘ve’ ‘lo’ ‘pe’
附表
| 轉(zhuǎn)義符 | 說(shuō)明 |
| 一般字符 | 除 .$ ^ { [ ( | ) * + ? / 外,其他字符與自身匹配。 |
| /a | 與響鈴(警報(bào))/u0007 匹配。 |
| /b | 在正則表達(dá)式中,/b 表示單詞邊界(在 /w 和 /w 之間),不過(guò),在 [] 字符類中,/b 表示退格符。在替換模式中,/b 始終表示退格符。 |
| /t | 與 tab 符 /u0009 匹配。 |
| /r | 與回車符 /u000d 匹配。 |
| /v | 與垂直 tab 符 /u000b 匹配。 |
| /f | 與換頁(yè)符 /u000c 匹配。 |
| /n | 與換行符 /u000a 匹配。 |
| /e | 與 esc 符 /u001b 匹配。 |
| /040 | 將 ascii 字符匹配為八進(jìn)制數(shù)(最多三位);如果沒(méi)有前導(dǎo)零的數(shù)字只有一位數(shù)或者與捕獲組號(hào)相對(duì)應(yīng),則該數(shù)字為后向引用。例如,字符/040 表示空格。 |
| /x20 | 使用十六進(jìn)制表示形式(恰好兩位)與 ascii 字符匹配。 |
| /cc | 與 ascii 控制字符匹配;例如,/cc 為 ctrl-c。 |
| /u0020 | 使用十六進(jìn)制表示形式(恰好四位)與 unicode 字符匹配。 |
| / | 在后面帶有不識(shí)別為轉(zhuǎn)義符的字符時(shí),與該字符匹配。例如,/* 與 /x2a 相同。 |
| 字符類 | 說(shuō)明 |
| . | 匹配除 /n 以外的任何字符。如果已用 singleline 選項(xiàng)做過(guò)修改,則句點(diǎn)字符可與任何字符匹配。 |
| [ aeiou ] | 與指定字符集中包含的任何單個(gè)字符匹配。 |
| [^ aeiou ] | 與不在指定字符集中的任何單個(gè)字符匹配。 |
| [0-9a-fa-f] | 使用連字號(hào) (–) 允許指定連續(xù)字符范圍。 |
| /p{ name } | 與 {name} 指定的命名字符類中的任何字符都匹配。支持的名稱為 unicode 組和塊范圍。例如,ll、nd、z、isgreek、isboxdrawing。可以使用 getunicodecategory 方法找到某個(gè)字符所屬的 unicode 類別。 |
| /p{ name } | 與在 {name} 中指定的組和塊范圍不包括的文本匹配。 |
| /w | 與任何單詞字符匹配。等效于 unicode 字符類別 [/p{ll}/p{lu}/p{lt}/p{lo}/p{nd}/p{pc}/p{lm}]。如果用 ecmascript 選項(xiàng)指定了符合 ecmascript 的行為,則 /w 等效于 [a-za-z_0-9]。 |
| /w | 與任何非單詞字符匹配。等效于 unicode 字符類別 [^/p{ll}/p{lu}/p{lt}/p{lo}/p{nd}/p{pc}/p{lm}]。如果用 ecmascript 選項(xiàng)指定了符合 ecmascript 的行為,則 /w 等效于 [^a-za-z_0-9]。 |
| /s | 與任何空白字符匹配。等效于 unicode 字符類別 [/f/n/r/t/v/x85/p{z}]。如果用 ecmascript 選項(xiàng)指定了符合 ecmascript 的行為,則 /s 等效于 [ /f/n/r/t/v]。 |
| /s | 與任何非空白字符匹配。等效于 unicode 字符類別 [^/f/n/r/t/v/x85/p{z}]。如果用 ecmascript 選項(xiàng)指定了符合 ecmascript 的行為,則 /s 等效于 [^ /f/n/r/t/v]。 |
| /d | 與任何十進(jìn)制數(shù)字匹配。對(duì)于 unicode 類別的 ecmascript 行為,等效于 /p{nd},對(duì)于非 unicode 類別的 ecmascript 行為,等效于 [0-9]。 |
| /d | 與任何非數(shù)字匹配。對(duì)于 unicode 類別的 ecmascript 行為,等效于 /p{nd},對(duì)于非 unicode 類別的 ecmascript 行為,等效于 [^0-9]。 |
| 斷言 | 說(shuō)明 |
| >^ | 指定匹配必須出現(xiàn)在字符串的開頭或行的開頭。 |
| $ | 指定匹配必須出現(xiàn)在以下位置:字符串結(jié)尾、字符串結(jié)尾處的 /n 之前或行的結(jié)尾。 |
| /a | 指定匹配必須出現(xiàn)在字符串的開頭(忽略 multiline 選項(xiàng))。 |
| /z | 指定匹配必須出現(xiàn)在字符串的結(jié)尾或字符串結(jié)尾處的 /n 之前(忽略 multiline 選項(xiàng))。 |
| /z | 指定匹配必須出現(xiàn)在字符串的結(jié)尾(忽略 multiline 選項(xiàng))。 |
| /g | 指定匹配必須出現(xiàn)在上一個(gè)匹配結(jié)束的地方。與 match.nextmatch() 一起使用時(shí),此斷言確保所有匹配都是連續(xù)的。 |
| /b | 指定匹配必須出現(xiàn)在 /w(字母數(shù)字)和 /w(非字母數(shù)字)字符之間的邊界上。匹配必須出現(xiàn)在單詞邊界上,即出現(xiàn)在由任何非字母數(shù)字字符分隔的單詞中第一個(gè)或最后一個(gè)字符上。 |
| /b | 指定匹配不得出現(xiàn)在 /b 邊界上。 |
| 限定符 | 說(shuō)明 |
| * | 指定零個(gè)或更多個(gè)匹配;例如 /w* 或 (abc)*。等效于 {0,}。 |
| + | 指定一個(gè)或多個(gè)匹配;例如 /w+ 或 (abc)+。等效于 {1,}。 |
| ? | 指定零個(gè)或一個(gè)匹配;例如 /w? 或 (abc)?。等效于 {0,1}。 |
| { n } | 指定恰好 n 個(gè)匹配;例如 (pizza){2}。 |
| { n ,} | 指定至少 n 個(gè)匹配;例如 (abc){2,}。 |
| { n , m } | 指定至少 n 個(gè)但不多于 m 個(gè)匹配。 |
| *? | 指定盡可能少地使用重復(fù)的第一個(gè)匹配(等效于 lazy *)。 |
| +? | 指定盡可能少地使用重復(fù)但至少使用一次(等效于 lazy +)。 |
| ?? | 指定使用零次重復(fù)(如有可能)或一次重復(fù) (lazy ?)。 |
| { n }? | 等效于 {n} (lazy {n})。 |
| { n ,}? | 指定盡可能少地使用重復(fù)但至少使用 n 次 (lazy {n,})。 |
| { n , m }? | 指定介于 n 次和 m 次之間、盡可能少地使用重復(fù) (lazy {n,m})。 |
新聞熱點(diǎn)
疑難解答
圖片精選