.NET正則表達式使用高級技巧之工作特點

語法:??,*?,+?,{n}?,{n,m}?

  涵義:簡單說,後面的這個?(lazy)告訴正則引擎,它前面的表達式匹配到最短的匹配項就不用匹配下去了,如??,?本身匹配0-1個匹配項,那麼??就取最短的,匹配0個項就不匹配下去了,同理,*?匹配0個,+?匹配1個,{n}?匹配n個,{n,m}?匹配n個。當用@”/w*?”匹配”abcd”時,會有五次成功匹配,每次都匹配的結果都是空字符串爲什麼會是5次呢,這是因爲正則引擎在匹配一個表達式時是一個字符一個字符對比下去的,每成功匹配一次,就前進一下。

  判斷表達式

  語法:

  1、A|B,這個是最基本的,A或者B,其實這個不能算判斷

  2、(?(expression)yes-expression|no-expression),其中no-expression爲可選項,意爲,如果expression成立,則要求匹配yes-expression,否則要求匹配no-expression

  3、(?(group-name)yes-expressioin|no-expression),其中no-expression爲可選項,意爲,如果名爲group-name的組匹配成功,則要求匹配yes-expression,否則要求匹配no-expression

  判斷表達式還是很好理解的,唯有一點要注意:@"(?(A)A|B)"不能匹配"AA",爲什麼呢?要怎麼樣寫才能匹配呢,大家先想想……

  我們應該這樣寫Regex: @”(?(A)AA|B)”,請注意,判斷式中的內容並不會做爲yes-expression或no-expression表達式的一部分。

  .net 的正則引擎工作特點

  .net的正則引擎工作方式大多數和我們“想當然”的方式一樣,只是有幾點要注意:

  1、.NET Framework 正則表達式引擎儘可能的匹配多的字符(貪婪)。正是由於這一點,所以,不要用@"<.*>(.*)</.*>"這樣的正則式來試圖找出一個HTML文檔中的所有innerText。(我也正是在網上看到有人這樣寫正則式才決定要寫《正則表達式 高級技巧》的,呵呵)

  2、.NET Framework 正則表達式引擎是回溯的正則表達式匹配器,它併入了傳統的非確定性有限自動機 (NFA) 引擎(例如 Perl、Python使用的引擎)。這使其有別於更快的、但功能更有限的純正則表達式確定性有限自動機 (DFA) 引擎。.NET Framework 正則表達式引擎儘量匹配成功,所以,當@"/w+/.(.*)/./w+"中的.*把www. .csdn.net中的.csdn.net都匹配完了,讓後面的/./w+沒得字符去匹配時,引擎會進行回溯,以得到成功的匹配。
 
  NET Framework 正則表達式引擎還包括了一組完整的語法,讓程序員能夠操縱回溯引擎。包括:

  “惰性”限定符:??、*?、+?、{n,m}?。這些惰性限定符指示回溯引擎首先搜索最少數目的重複。與之相反,普通的“貪婪的”限定符首先嚐試匹配最大數目的重複。

  從右到左匹配。這在從右到左而非從左到右搜索的情況下十分有用,或者在從模式的右側部分開始搜索比從模式的左側部分開始搜索更爲有效的情況下十分有用。

  3、.NET Framework 正則表達式引擎在(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();
}

  輸出結果是: ‘TH’ ‘IN’ ‘is’ ‘as’ ‘ne’ ‘de’ ‘ve’ ‘lo’ ‘pe’

  附表

轉義符 說明
一般字符 除 .$ ^ { [ ( | ) * + ? / 外,其他字符與自身匹配。
/a 與響鈴(警報)/u0007 匹配。
/b 在正則表達式中,/b 表示單詞邊界(在 /w 和 /W 之間),不過,在 [] 字符類中,/b 表示退格符。在替換模式中,/b 始終表示退格符。
/t 與 Tab 符 /u0009 匹配。
/r 與回車符 /u000D 匹配。
/v 與垂直 Tab 符 /u000B 匹配。
/f 與換頁符 /u000C 匹配。
/n 與換行符 /u000A 匹配。
/e 與 Esc 符 /u001B 匹配。
/040 將 ASCII 字符匹配爲八進制數(最多三位);如果沒有前導零的數字只有一位數或者與捕獲組號相對應,則該數字爲後向引用。例如,字符/040 表示空格。
/x20 使用十六進制表示形式(恰好兩位)與 ASCII 字符匹配。
/cC 與 ASCII 控制字符匹配;例如,/cC 爲 Ctrl-C。
/u0020 使用十六進制表示形式(恰好四位)與 Unicode 字符匹配。
/ 在後面帶有不識別爲轉義符的字符時,與該字符匹配。例如,/* 與 /x2A 相同。
字符類 說明
. 匹配除 /n 以外的任何字符。如果已用 Singleline 選項做過修改,則句點字符可與任何字符匹配。
[ aeiou ] 與指定字符集中包含的任何單個字符匹配。
[^ aeiou ] 與不在指定字符集中的任何單個字符匹配。
[0-9a-fA-F] 使用連字號 (–) 允許指定連續字符範圍。
/p{ name }

與 {name} 指定的命名字符類中的任何字符都匹配。支持的名稱爲 Unicode 組和塊範圍。例如,Ll、Nd、Z、IsGreek、IsBoxDrawing。可以使用 GetUnicodeCategory 方法找到某個字符所屬的 Unicode 類別。

/P{ name } 與在 {name} 中指定的組和塊範圍不包括的文本匹配。
/w 與任何單詞字符匹配。等效於 Unicode 字符類別 [/p{Ll}/p{Lu}/p{Lt}/p{Lo}/p{Nd}/p{Pc}/p{Lm}]。如果用 ECMAScript 選項指定了符合 ECMAScript 的行爲,則 /w 等效於 [a-zA-Z_0-9]。
/W 與任何非單詞字符匹配。等效於 Unicode 字符類別 [^/p{Ll}/p{Lu}/p{Lt}/p{Lo}/p{Nd}/p{Pc}/p{Lm}]。如果用 ECMAScript 選項指定了符合 ECMAScript 的行爲,則 /W 等效於 [^a-zA-Z_0-9]。
/s 與任何空白字符匹配。等效於 Unicode 字符類別 [/f/n/r/t/v/x85/p{Z}]。如果用 ECMAScript 選項指定了符合 ECMAScript 的行爲,則 /s 等效於 [ /f/n/r/t/v]。
/S 與任何非空白字符匹配。等效於 Unicode 字符類別 [^/f/n/r/t/v/x85/p{Z}]。如果用 ECMAScript 選項指定了符合 ECMAScript 的行爲,則 /S 等效於 [^ /f/n/r/t/v]。
/d 與任何十進制數字匹配。對於 Unicode 類別的 ECMAScript 行爲,等效於 /p{Nd},對於非 Unicode 類別的 ECMAScript 行爲,等效於 [0-9]。
/D 與任何非數字匹配。對於 Unicode 類別的 ECMAScript 行爲,等效於 /P{Nd},對於非 Unicode 類別的 ECMAScript 行爲,等效於 [^0-9]。
斷言 說明
>^ 指定匹配必須出現在字符串的開頭或行的開頭。
$ 指定匹配必須出現在以下位置:字符串結尾、字符串結尾處的 /n 之前或行的結尾。
/A 指定匹配必須出現在字符串的開頭(忽略 Multiline 選項)。
/Z 指定匹配必須出現在字符串的結尾或字符串結尾處的 /n 之前(忽略 Multiline 選項)。
/z 指定匹配必須出現在字符串的結尾(忽略 Multiline 選項)。
/G 指定匹配必須出現在上一個匹配結束的地方。與 Match.NextMatch() 一起使用時,此斷言確保所有匹配都是連續的。
/b 指定匹配必須出現在 /w(字母數字)和 /W(非字母數字)字符之間的邊界上。匹配必須出現在單詞邊界上,即出現在由任何非字母數字字符分隔的單詞中第一個或最後一個字符上。
/B 指定匹配不得出現在 /b 邊界上。
限定符 說明
* 指定零個或更多個匹配;例如 /w* 或 (abc)*。等效於 {0,}。
+ 指定一個或多個匹配;例如 /w+ 或 (abc)+。等效於 {1,}。
? 指定零個或一個匹配;例如 /w? 或 (abc)?。等效於 {0,1}。
{ n } 指定恰好 n 個匹配;例如 (pizza){2}。
{ n ,} 指定至少 n 個匹配;例如 (abc){2,}。
{ n , m } 指定至少 n 個但不多於 m 個匹配。
*? 指定儘可能少地使用重複的第一個匹配(等效於 lazy *)。
+? 指定儘可能少地使用重複但至少使用一次(等效於 lazy +)。
?? 指定使用零次重複(如有可能)或一次重複 (lazy ?)。
{ n }? 等效於 {n} (lazy {n})。
{ n ,}? 指定儘可能少地使用重複但至少使用 n 次 (lazy {n,})。
{ n , m }? 指定介於 n 次和 m 次之間、儘可能少地使用重複 (lazy {n,m})。

 
發佈了102 篇原創文章 · 獲贊 4 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章