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

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

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

2019-11-17 04:53:50
字體:
來(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、AB,這個(gè)是最基本的,A或者B,其實(shí)這個(gè)不能算判定

  2、(?(eXPRession)yes-expressionno-expression),其中no-expression為可選項(xiàng),意為,假如expression成立,則要求匹配yes-expression,否則要求匹配no-expression

  3、(?(group-name)yes-expressioinno-expression),其中no-expression為可選項(xiàng),意為,假如名為group-name的組匹配成功,則要求匹配yes-expression,否則要求匹配no-expression

  判定表達(dá)式還是很好理解的,唯有一點(diǎn)要注重:@"(?(A)AB)"不能匹配"AA",為什么呢?要怎么樣寫(xiě)才能匹配呢,大家先想想……

  我們應(yīng)該這樣寫(xiě)Regex: @”(?(A)AAB)”,請(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)上看到有人這樣寫(xiě)正則式才決定要寫(xiě)《正則表達(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è)部分開(kāi)始搜索比從模式的左側(cè)部分開(kāi)始搜索更為有效的情況下十分有用。

  3、.NET Framework 正則表達(dá)式引擎在(expression1expression2expression3)這樣情況下,expression1總是最先得到嘗試,再依次是expression2和expression3

.NET正則表達(dá)式使用高級(jí)技巧之工作特點(diǎn)(圖一)publicstaticvoidMain()
.NET正則表達(dá)式使用高級(jí)技巧之工作特點(diǎn)(圖二).NET正則表達(dá)式使用高級(jí)技巧之工作特點(diǎn)(圖三).NET正則表達(dá)式使用高級(jí)技巧之工作特點(diǎn)(圖四){
.NET正則表達(dá)式使用高級(jí)技巧之工作特點(diǎn)(圖五)strings="THINisaasp.netdeveloper.";
.NET正則表達(dá)式使用高級(jí)技巧之工作特點(diǎn)(圖五)Regexreg=newRegex(@"(/w{2}/w{3}/w{4})",RegexOptions.CompiledRegexOptions.IgnoreCase);
.NET正則表達(dá)式使用高級(jí)技巧之工作特點(diǎn)(圖五)MatchCollectionmc=reg.Matches(s);
.NET正則表達(dá)式使用高級(jí)技巧之工作特點(diǎn)(圖五)foreach(Matchminmc)
.NET正則表達(dá)式使用高級(jí)技巧之工作特點(diǎn)(圖五)Console.WriteLine(m.Value);
.NET正則表達(dá)式使用高級(jí)技巧之工作特點(diǎn)(圖五)Console.ReadLine();
.NET正則表達(dá)式使用高級(jí)技巧之工作特點(diǎn)(圖六)}

  輸出結(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ò),在 [] 字符類(lèi)中,/b 表示退格符。在替換模式中,/b 始終表示退格符。/t 與 Tab 符 /u0009 匹配。/r 與回車(chē)符 /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 相同。字符類(lèi) 說(shuō)明 . 匹配除 /n 以外的任何字符。假如已用 Singleline 選項(xiàng)做過(guò)修改,則句點(diǎn)字符可與任何字符匹配。[ aeiou ] 與指定字符集中包含的任何單個(gè)字符匹配。[^ aeiou ] 與不在指定字符集中的任何單個(gè)字符匹配。[0-9a-fA-F] 使用連字號(hào) (–) 答應(yīng)指定連續(xù)字符范圍。/p{ name } 與 {name} 指定的命名字符類(lèi)中的任何字符都匹配。支持的名稱(chēng)為 Unicode 組和塊范圍。例如,Ll、Nd、Z、IsGreek、IsBoxDrawing??梢允褂?GetUnicodeCategory 方法找到某個(gè)字符所屬的 Unicode 類(lèi)別。/P{ name } 與在 {name} 中指定的組和塊范圍不包括的文本匹配。/w 與任何單詞字符匹配。等效于 Unicode 字符類(lèi)別 [/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 字符類(lèi)別 [^/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 字符類(lèi)別 [/f/n/r/t/v/x85/p{Z}]。假如用 ECMAScript 選項(xiàng)指定了符合 ECMAScript 的行為,則 /s 等效于 [ /f/n/r/t/v]。/S 與任何非空白字符匹配。等效于 Unicode 字符類(lèi)別 [^/f/n/r/t/v/x85/p{Z}]。假如用 ECMAScript 選項(xiàng)指定了符合 ECMAScript 的行為,則 /S 等效于 [^ /f/n/r/t/v]。/d 與任何十進(jìn)制數(shù)字匹配。對(duì)于 Unicode 類(lèi)別的 ECMAScript 行為,等效于 /p{Nd},對(duì)于非 Unicode 類(lèi)別的 ECMAScript 行為,等效于 [0-9]。/D 與任何非數(shù)字匹配。對(duì)于 Unicode 類(lèi)別的 ECMAScript 行為,等效于 /P{Nd},對(duì)于非 Unicode 類(lèi)別的 ECMAScript 行為,等效于 [^0-9]。斷言 說(shuō)明 >^ 指定匹配必須出現(xiàn)在字符串的開(kāi)頭或行的開(kāi)頭。$ 指定匹配必須出現(xiàn)在以下位置:字符串結(jié)尾、字符串結(jié)尾處的 /n 之前或行的結(jié)尾。/A 指定匹配必須出現(xiàn)在字符串的開(kāi)頭(忽略 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)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 襄汾县| 那坡县| 新丰县| 遂平县| 木里| 西和县| 中西区| 库车县| 长兴县| 河南省| 卓尼县| 瓦房店市| 潼关县| 张家川| 丹东市| 清徐县| 公主岭市| 固始县| 桐城市| 穆棱市| 庆云县| 平谷区| 雅江县| 宾阳县| 黑河市| 肥城市| 青冈县| 射阳县| 华池县| 含山县| 万源市| 赞皇县| 武宁县| 渭源县| 深泽县| 东光县| 阜城县| 鄂托克旗| 阿鲁科尔沁旗| 屯门区| 百色市|