国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > .NET > 正文

.NET正則表達(dá)式使用高級(jí)技巧之工作特點(diǎn)

2024-07-10 13:13:00
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  語(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})。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 霞浦县| 宜春市| 同仁县| 汽车| 财经| 新干县| 平安县| 天祝| 米泉市| 花垣县| 嘉定区| 桐梓县| 兰西县| 老河口市| 阳原县| 郁南县| 内黄县| 黄平县| 澄城县| 黔西县| 仲巴县| 措美县| 洪雅县| 咸宁市| 邵武市| 侯马市| 庆阳市| 鄂州市| 兴安盟| 镇康县| 孟津县| 五台县| 凤凰县| 米易县| 河东区| 盱眙县| 乐陵市| 莆田市| 连云港市| 阿瓦提县| 革吉县|