30分鍾帶你進入正則,敢來么(呵呵)!


說到到底什么是正則表達式?

      程序員在編寫處理字符串的程序網頁時,經常會有查找符合某些復雜規則的字符串的需要。正則表達式就是用於描述這些規則的工具。換句話講正則表達式就是記錄文本規則的代碼。它比通配符更能精確的描述出你的需求。當然天下沒有白吃的午餐,我們想要實現更精准的數據就要更用心了解正則

下面我們來舉例子更清楚的了解正則表達式的用法!

      假設你在一篇文章中要查找hello,你可以使用正則表達式hello。通常,處理正則表達式的工具會提供一個忽略大小寫的選項,如果選中了這個選項,它可以匹配hi,HI,Hi,hI這四種情況中的任意一種。如果我們要精確地查找hello,我們應該使用\bhello\b\b是正則表達式規定的一個特殊代碼(也叫它元字符,metacharacter),代表開頭或結尾。如果同時使用其它元字符,我們就能構造出功能更強大的正則表達式。

比如下面這個例子:

0\d\d-\d\d\d\d\d\d\d\d匹配這樣的字符串:以0開頭,然后是兩個數字,然后是一個連字號“-”,最后是8個數字(也就是中國的電話號碼。當然,這個例子只能匹配區號為3位的情形)。這里的\d是個新的元字符,匹配一位數字(0,或1,或2,或……)。-不是元字符,只匹配它本身——連字符(或者減號,或者中橫線,或者隨你怎么稱呼它)。為了避免那么多煩人的重復,我們也可以這樣寫這個表達式:0\d{2}-\d{8}。這里\d后面的{3}({8})的意思是前面\d必須連續重復匹配3次(8次)。如果你不覺得正則表達式很難讀寫的話,要么你是一個天才,要么,你不是地球人。正則表達式的語法很令人頭疼,即使對經常使用它的人來說也是如此。由於難於讀寫,容易出錯,所以找一種工具對正則表達式進行測試是很有必要的

元字符

元字符^(和數字6在同一個鍵位上的符號)和$都匹配一個位置,這和\b有點類似。^匹配你要用來查找的字符串的開頭,$匹配結尾。這兩個代碼在驗證輸入的內容時非常有用,比如一個網站如果要求你填寫的QQ號必須為5位到12位數字時,可以使用:^\d{5,12}$。這里的{5,12}和前面介紹過的{2}是類似的,只不過{2}匹配只能不多不少重復2次,{5,12}則是重復的次數不能少於5次,不能多於12次,否則都不匹配。因為使用了^和$,所以輸入的整個字符串都要用來和\d{5,12}來匹配,也就是說整個輸入必須是5到12個數字,因此如果輸入的QQ號能匹配這個正則表達式的話,那就符合要求了。和忽略大小寫的選項類似,有些正則表達式處理工具還有一個處理多行的選項。如果選中了這個選項,^和$的意義就變成了匹配行的開始處和結束處。

字符轉義

如果你想查找元字符本身的話,比如你查找 . ,或者 * ,就出現了問題:你沒辦法指定它們,因為它們會被解釋成別的意思。這時你就得使用\來取消這些字符的特殊意義。因此,你應該使用\.和\*。當然,要查找\本身,你也得用\\.

例如:dee\.MP3匹配dee.MP3,E:\\Windows匹配E:\Windows。

字符類

我們也可以輕松地指定一個字符范圍,像[0-9]代表的含意與\d就是完全一致的:一位數字;同理[a-z0-9A-Z_]也完全等同於\w

分枝條件

分枝條件指的是有幾種規則,如果滿足其中任意一種規則都應該當成匹配,具體方法是用|把不同的規則分隔開。

 

0\d{2}-\d{8}|0\d{3}-\d{7}這個表達式能匹配兩種以連字號分隔的電話號碼:一種是三位區號,8位本地號(如010-12345678),一種是4位區號,7位本地號(0376-2233445)。使用分枝條件時,要注意各個條件的順序。如果你把它改成\d{5}|\d{5}-\d{4}的話,那么就只會匹配5位的郵編(以及9位郵編的前5位)。原因是匹配分枝條件時,將會從左到右地測試每個條件,如果滿足了某個分枝的話,就不會去再管其它的條件了。

反義

有時需要查找不屬於某個能簡單定義的字符類的字符。比如想查找除了數字以外,其它任意字符都行的情況,這時需要用到反義:

代碼/語法 說明
\W 匹配任意不是字母,數字,下划線,漢字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非數字的字符
\B 匹配不是單詞開頭或結束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou這幾個字母以外的任意字符

    

 

 

 

 

 

 

注釋

 

小括號的另一種用途是通過語法(?#comment)來包含注釋。例如:2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)。要包含注釋的話,最好是啟用“忽略模式里的空白符”選項,這樣在編寫表達式時能任意的添加空格,Tab,換行,而實際使用時這些都將被忽略。啟用這個選項后,在#后面到這一行結束的所有文本都將被當成注釋忽略掉。

例如,我們可以前面的一個表達式寫成這樣:

 

      (?<=    # 斷言要匹配的文本的前綴
      <(\w+)> # 查找尖括號括起來的字母或數字(即HTML/XML標簽)
      )       # 前綴結束
      .*      # 匹配任意文本
      (?=     # 斷言要匹配的文本的后綴
      <\/\1>  # 查找尖括號括起來的內容:前面是一個"/",后面是先前捕獲的標簽
      )       # 后綴結束

 

尚未詳細討論的語法

代碼/語法 說明
\a 報警字符(打印它的效果是電腦嘀一聲)
\b 通常是單詞分界位置,但如果在字符類里使用代表退格
\t 制表符,Tab
\r 回車
\v 豎向制表符
\f 換頁符
\n 換行符
\e Escape
\0nn ASCII代碼中八進制代碼為nn的字符
\xnn ASCII代碼中十六進制代碼為nn的字符
\unnnn Unicode代碼中十六進制代碼為nnnn的字符
\cN ASCII控制字符。比如\cC代表Ctrl+C
\A 字符串開頭(類似^,但不受處理多行選項的影響)
\Z 字符串結尾或行尾(不受處理多行選項的影響)
\z 字符串結尾(類似$,但不受處理多行選項的影響)
\G 當前搜索的開頭
\p{name} Unicode中命名為name的字符類,例如\p{IsGreek}
(?>exp) 貪婪子表達式
(?<x>-<y>exp) 平衡組
(?im-nsx:exp) 在子表達式exp中改變處理選項
(?im-nsx) 為表達式后面的部分改變處理選項
(?(exp)yes|no) 把exp當作零寬正向先行斷言,如果在這個位置能匹配,使用yes作為此組的表達式;否則使用no
(?(exp)yes) 同上,只是使用空表達式作為no
(?(name)yes|no) 如果命名為name的組捕獲到了內容,使用yes作為表達式;否則使用no
(?(name)yes) 同上,只是使用空表達式作為no

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

以上內容均為原文摘取,並非個人原創!!!如果想了解更多請查看正則文檔

 

大家可以關注本人新浪微博:李曉鵬0204   一起探討學術問題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM