天天看點

正規表達式整理篇

   用了正規表達式很久,但一直都用得很皮毛,很多時候都去網站搜比對的正則代碼。終究覺得這不是一個事兒,靜下心來好好縷縷吧。

正規表達式幹嘛的?

正規表達式就是記錄文本規則的代碼(沒有數學運算)。

在編寫處理字元串的程式或網頁時,經常會有查找符合某些複雜規則的字元串的需要。

推薦入門文章,自己看去

http://deerchao.net/tutorials/regex/regex.htm#introduction 

如果您已經有所了解,可以直接看我下面的筆記。這是一篇總結性的文章,不具備原創性。

重要的幾個概念

1.元字元

 .  比對除換行符以外的任意字元

\w 比對字母或數字或下劃線或漢字

\s 比對任意的空白符

\d 比對數字

\b 比對單詞的開始或結束

^  比對字元串的開始

$  比對字元串的結束

\b 指定一個位置,單詞分隔符

* 會被解釋成任意的字元串

2.字元轉義(\)

 查找元字元本身,用\ 進行轉義。

3.重複

下面是正規表達式中所有的限定符(指定數量的代碼,例如*,{5,12}等):

表2.常用的限定符

代碼/文法 說明
* 重複零次或更多次
+ 重複一次或更多次
? 重複零次或一次
{n} 重複n次
{n,} 重複n次或更多次
{n,m} 重複n到m次

指的是單個字元的重複;而下面的提到的分組,是指多個字元(即字元串)的重複。

4.字元類

5.分枝條件(|)

解決 or 的問題,通俗的說法,比對A或B (A|B)。

6.分組

  描述字元串的重複比對規則。即,重複多個字元又該怎麼辦?

  你可以用小括号來指定子表達式(也叫做分組),然後你就可以指定這個子表達式的重複次數了。如:(\d{1,3}\.){3}:\d{1,3}比對1到3位的數字,(\d{1,3}\.){3}比對三位數字加上一個英文句号(這個整體也就是這個分組)重複3次,最後再加上一個一到三位的數字(\d{1,3})。

7.反義

查找除**以外的字元時,這時需要用到反義。

8.後向引用

用于重複搜尋前面某個分組比對的文本。即引用前面已經比對的内容。

怎麼引用比對的文本呢?

  小括号指定一個子表達式後(分組),比對這個子表達式的文本(也就是此分組捕獲的内容)可以在表達式或其它程式中作進一步的處理。預設情況下,每個分組會自動擁有一個組号,生成規則是:

  • 分組0對應整個正規表達式
  • 實際上組号配置設定過程是要從左向右掃描兩遍的:第一遍隻給未命名組配置設定,第二遍隻給命名組配置設定--是以所有命名組的組号都大于未命名的組号
  • 你可以使用(?:exp)這樣的文法來剝奪一個分組對組号配置設定的參與權.

9.零寬斷言

  查找在某些内容(但并不包括這些内容)之前或之後的東西,也就是說它們像\b,^,$那樣用于指定一個位置(本身不表示任何字元),這個位置應該滿足一定的條件(即斷言),是以它們也被稱為零寬斷言。

  分為四類:

  (?=exp)也叫零寬度正預測先行斷言,它斷言自身出現的位置的後面能比對表達式exp。比如\b\w+(?=ing\b),比對以ing結尾的單詞的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.時,它會比對sing和danc。

  (?<=exp)也叫零寬度正回顧後發斷言,它斷言自身出現的位置的前面能比對表達式exp。比如(?<=\bre)\w+\b會比對以re開頭的單詞的後半部分(除了re以外的部分),例如在查找reading a book時,它比對ading。

  

  (?!exp)零寬度負預測先行斷言,斷言此位置的後面不能比對表達式exp。例如:\d{3}(?!\d)比對三位數字,而且這三位數字的後面不能是數字;\b((?!abc)\w)+\b比對不包含連續字元串abc的單詞。 

  (?<!exp)零寬度負回顧後發斷言,斷言此位置的前面不能比對表達式exp:(?<![a-z])\d{7}比對前面不是小寫字母的七位數字。 

貪婪與懶惰

貪婪比對:當正規表達式中包含能接受重複的限定符時,通常的行為是(在使整個表達式能得到比對的前提下)比對盡可能多的字元。

   文法:正規表達式中包含能接受重複的限定符,即為貪婪比對模式。如:a.*b,用它來搜尋aabab的話,它會比對整個字元串aabab

懶惰比對:與貪婪相反,*** ... 比對盡可能少的字元。

   文法:隻要在限定符它後面加上一個問号?。a.*?b,用它來搜尋aabab的話,它會比對aab(第一到第三個字元)和ab(第四到第五個字元)。

懶惰限定符

表5.懶惰限定符

代碼/文法 說明
*? 重複任意次,但盡可能少重複
+? 重複1次或更多次,但盡可能少重複
?? 重複0次或1次,但盡可能少重複
{n,m}? 重複n到m次,但盡可能少重複
{n,}? 重複n次以上,但盡可能少重複

平衡組/遞歸比對

.NET 中正規表達式處理選項

下面是.Net中常用的正規表達式選項:

表6.常用的處理選項

名稱 說明
IgnoreCase(忽略大小寫) 比對時不區分大小寫。
Multiline(多行模式) 更改^和$的含義,使它們分别在任意一行的行首和行尾比對,而不僅僅在整個字元串的開頭和結尾比對。(在此模式下,$的精确含意是:比對\n之前的位置以及字元串結束前的位置.)
Singleline(單行模式) 更改.的含義,使它與每一個字元比對(包括換行符\n)。
IgnorePatternWhitespace(忽略空白) 忽略表達式中的非轉義空白并啟用由#标記的注釋。
ExplicitCapture(顯式捕獲) 僅捕獲已被顯式命名的組。

注釋 

小括号的另一種用途是通過文法(?#comment)來包含注釋。例如:2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)。

一些雜碎的體會

常用的正規表達式文法

常用的正規表達式