天天看點

正規表達式(regular expression)——學習筆記

平時我們查找硬碟上的檔案時,使用 ? 和 * 來進行通配符比對,這就類似正規表達式中的概念(但它實際的意義是不一樣的)

使用正規表達式,可以很友善的替換文本。

正規表達式在 *nix(Linux, Unix等)、HP 等作業系統,PHP、C#、Java 等開發環境,以及很多的應用軟體中都有着很好的應用。

正規表達式是什麼?

  • 正規表達式描述一種字元串比對的模式,它作為模闆将某個字元模式與所搜尋的字元串進行比對。
  • 構造正規表達式的方法和建立數學表達式的方法一樣。用多種元字元與運算符将小的表達式結合在一起來建立更大的表達式。

正規表達式的組成

普通字元

  • 所有大寫和小寫字母、所有數字、所有标點符号和一些其他符号。(沒有顯式指定為元字元的所有可列印和不可列印字元)

非列印字元

字元 描述
\cx 比對由x指明的控制字元。例如, \cM 比對一個 Control-M 或回車符。 x 的值必須為 A-Z 或 a-z 之一 。否則,将 c 視為一個原義的 ‘c’ 字元。
\f 比對一個換行符。等價于 \x0a 和 \cJ。
\r 比對一個回車符。等價于 \x0d 和 \cM。
\t 比對一個制表符。等價于 \x09 和 \cI。
\v 比對一個垂直制表符。等價于 \x0b 和 \cK。
\s 比對任何空白字元,包括空格、制表符、換頁符等等。等價于 [ \f\n\r\t\v]。
\S 比對任何非空白字元。等價于 [^ \f\n\r\t\v]。
\d 比對一個數字字元。等價于 [0-9]。
\w 比對包括下劃線的任何單詞字元。等價于’[A-Za-z0-9_]’。

D,W的比對均是對小寫取反,類似s和S

特殊字元

一些有特殊含義的字元。若要比對這些特殊字元,必須首先使字元轉義,即将反斜杠字元放在它們前面。

特别字元 描述
( ) 标記一個子表達式的開始和結束位置。子表達式可以擷取供以後使用。
. 比對除換行符 \n 之外的任何單字元。
\ 将下一個字元标記為或特殊字元、或原義字元、或向後引用、或八進制轉義符。
[ 标記一個中括号表達式的開始。例如,’[abc]’ 可以比對 “plain”中的’a’。
{ 标記限定符表達式的開始。
| 指明兩項之間的一個選擇。

限定符

限定符用來指定正規表達式的一個給定元件必須要出現多少次才能滿足比對。

限定符 描述
* 比對前面的子表達式零次或多次。
+ 比對前面的子表達式一次或多次。
? 比對前面的子表達式零次或一次,或指明一個非貪婪限定符。
{n} n是一個非負整數。比對确定的n次。例如,’o{2}’ 不能比對 “Bob”中的’o’,但是能比對 “food”中的兩個 o。
{n,} n是一個非負整數。至少比對n次。例如,’o{2,}’不能比對”Bob”中的’o’,但能比對”foooood”中的所有o。’o{1,}’等價于’o+’。’o{0,}’則等價于 ‘o*’。
{n,m} m和n均為非負整數,最少比對n次且最多比對m次。例如,”o{1,3}” 将比對 “fooooood” 中的前三個 o。’o{0,1}’ 等價于 ‘o?’。請注意在逗号和兩個數之間 不能有空格
  • *, +, ?, {n}, {n,}, {n,m}限定符都是貪婪的,因為它們會盡可能多的比對文字,在它們的後面加上一個?就可以實作非貪婪或最小比對。

舉例

  • abaccccda
    • /a.*a/ 比對abaccccda
    • /a.*?a/ 比對aba
  • 比對章節
    • /Chapter [1-9][0-9]*/ 比對從1開始,任何位數
    • /Chapter [0-9]{1,2}/ 比對兩位數,但是實際上開頭為0~99的章節數都會被比對
    • /Chapter [1-9][0-9]?/ 比對從1~99

定位符

定位符用來描述字元串或單詞的邊界

定位 描述
$ 比對輸入字元串的結尾位置。如果設定了 RegExp 對象的 Multiline 屬性,則 $ 也比對 ‘\n’ 或 ‘\r’。
^ 比對輸入字元串的開始位置,除非在方括号表達式中使用,此時它表示不接受該字元集合。
\b 比對一個字邊界,即字與空格間的位置,單詞的開頭也是字邊界。
\B 非字邊界比對。

注意:不能将限定符與定位點一起使用。

舉例

  • Chapter aptitude
    • /\bCha/ 比對單詞 Chapter 的開頭三個字元
    • /\Bapt/ 比對 Chapter 中的字元串 apt,但不比對 aptitude 中的字元串 apt

選擇

用圓括号将所有選擇項括起來,相鄰的選擇項之間用|分隔。但用圓括号會有一個副作用,是相關的比對會被存儲到一個臨時緩沖區中,所捕獲的每個子比對都按照在正規表達式模式中從左到右出現的順序存儲。緩沖區編号從 1 開始,最多可存儲 99 個捕獲的子表達式。每個緩沖區都可以使用 ‘\m’ 通路,其中m為一個辨別特定緩沖區的一位或兩位十進制數。

  • 例如:Is is the cost of of gasoline going up up?
    • 正規表達式:/\b([a-z]+) \1\b/gi
    • 第一部分 \b([a-z]+) :字元邊界開始一個或多個字母。
    • \1對第一個比對模式的引用,也就是引用了 \b([a-z]+)
    • 是以像 Is is 和 of of 這種重複出現的單詞會被識别出來
  • http://www.nihao.com:80/html/html-hi.html
    • /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/
    • 第一部分 (\w+):\/\/       \w表示[A-Za-z0-9]也就是所有字母和數字,+表示至少一個,:\/\/表示網址部分的://,由于/是特殊符号,是以加上轉義符号。結果為協定部分,http.
    • 第二部分 ([^/:]+)      [^/:]表示除了/和:以外的字元,+表示至少一個。結果為域名,www.nihao.com
    • 第三部分(:\d*)?      :\d表示 : 之後出現的數字,*表示0個或多個,最後的?表示隻重複一次比對。結果為端口:80
    • 第四部分([^# ])      [^# ]表示不包括#或空格字元的任何字元,表示個或多個。結果為html-hi.html

可以使用非捕獲元字元 ‘?:’、’?=’ 或 ‘?!’ 來重寫捕獲,忽略對相關比對的儲存。

正規表達式(regular expression)——學習筆記

圖檔來自http://www.runoob.com/

正規表達式運算符優先級

正規表達式從左到右進行計算,并遵循優先級順序,這與算術表達式非常類似。

轉義符 > 圓括号和方括号 > 限定符 > 定位點和序列 > “或”操作

其他

  • /g
    • global可選标志,帶這個标志表示替換将針對行中每個比對的串進行,否則則隻替換行中第一個比對串。如:we.fdffddfwe.加上/g後,則2個we都會出來
  • /i
    • 區分大小寫小字。如:ab與Ab不同;
  • 字元簇
    正規表達式(regular expression)——學習筆記
    圖檔來自http://www.runoob.com/

自己加油加油 笨鳥後飛也要飛呀飛

繼續閱讀