.NETRegex使用進階技巧之工作特點

來源:互聯網
上載者:User
進階|技巧|正則

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

  涵義:簡單說,後面的這個?(lazy符)告訴正則引擎,它前面的運算式匹配到最短的匹配項就不用匹配下去了,如??,?本身匹配0-1個匹配項,那麼??就取最短的,匹配0個項就不匹配下去了,同理,*?匹配0個,+?匹配1個,{n}?匹配n個,{n,m}?匹配n個。當用@”\w*?”匹配”abcd”時,會有五次成功匹配,每次都匹配的結果都是Null 字元串,為什麼會是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 Regex引擎儘可能的匹配多的字元(貪婪)。正是由於這一點,所以,不要用@"<.*>(.*)</.*>"這樣的正則式來試圖找出一個HTML文檔中的所有innerText。(我也正是在網上看到有人這樣寫正則式才決定要寫《Regex 進階技巧》的,呵呵)

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

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

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

  3、.NET Framework Regex引擎在(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 在Regex中,\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})。



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。