1. 程式人生 > >玩轉正則表達式(Regular),這個世界正在獎勵偷偷用心的人

玩轉正則表達式(Regular),這個世界正在獎勵偷偷用心的人

分配 電腦 默認 ascii -h 過程 tro 字符串 貪婪

  聲明:以下只是本人學習正則表達式的筆記概要,主要參考:

  正則表達式30分鐘入門教程

1.必記的常用元字符:

. 匹配除換行符以外的任意字符
\w 匹配字母或數字或下劃線或漢字 \W表示與之相反
\s 匹配任意的空白符 \S表示與之相反
\d 匹配數字 \D表示與之相反
\b 匹配單詞的開始或結束 \B表示與之相反
^ 匹配字符串的開始
$ 匹配字符串的結束
[x] 匹配字符x [^x]表示出來字符x以外的任意字符
[aeiou] 匹配英語中的元音字母 [^aeiou] 表示除了元音字母以外的所有字符

2.必記的常用限定符

* 重復零次或更多次
+ 重復一次或更多次
? 重復零次或一次
{n} 重復n次
{n,}

重復n次或更多次
{n,m} 重復n到m次

3.必記的常用分組語法

  小括號表示一個子表達式,匹配這個子表達式也就是捕獲匹配到的文本,
  默認情況下,每個分組會自動擁有一個組號,規則是:從左向右,以分組的左括號為標誌,第一個出現的分組的組號為1,第二個為2,以此類推,
  組號分配過程是要從左向右掃描兩遍的:第一遍只給未命名組分配,第二遍只給命名組分配--因此所有命名組的組號都大於未命名的組號

  3.1捕獲
    (exp) 匹配exp,並捕獲文本到自動命名的組裏 \b(\w+)\b\s+\1\b可以用來匹配重復的單詞,像go go, 或者kitty kitty
    (?<name>exp)

匹配exp,並捕獲文本到名稱為name的組裏,也可以寫成(?‘name‘exp)

    上面的正則指定組名,可以寫成\b(?<Word>\w+)\b\s+\k<Word>\b

    (?:exp) 匹配exp,不捕獲匹配的文本,也不給此分組分配組號 (?:@\w*)binguo\w*[email protected]
      (?:exp)不會改變正則表達式的處理方式,只是這樣的組匹配的內容不會像前兩種那樣被捕獲到某個組裏面,也不會擁有組號
  3.2零寬斷言
    (?=exp) 匹配exp前面的位置 \b\w+(?=ing\b)

I‘m singing while you‘re dancing 匹配sing和danc
    (?<=exp) 匹配exp後面的位置

       (?<=\bre)\w+\b reading a book 匹配ading (?<=\s)\d+(?=\s)匹配以空白符間隔的數字(再次強調,不包括這些空白符)
    (?!exp) 匹配後面跟的不是exp的位置

       \b((?!abc)\w)+\b匹配不包含連續字符串abc的單詞\d{3}(?!\d)匹配三位數字,而且這三位數字的後面不能是數字

    (?<!exp) 匹配前面不是exp的位置 (?<![a-z])\d{7}匹配前面不是小寫字母的七位數字
       (?<=<(\w+)>).*(?=<\/\1>)匹配不包含屬性的簡單HTML標簽內裏的內容
  3.3註釋
    (?#comment) 這種類型的分組不對正則表達式的處理產生任何影響,用於提供註釋讓人閱讀
    (?<= # 斷言要匹配的文本的前綴
    <(\w+)> # 查找尖括號括起來的字母或數字(即HTML/XML標簽)
    ) # 前綴結束
    .* # 匹配任意文本
    (?= # 斷言要匹配的文本的後綴
    <\/\1> # 查找尖括號括起來的內容:前面是一個"/",後面是先前捕獲的標簽
    ) # 後綴結束

4.必記的懶惰限定符

*? 重復任意次,但盡可能少重復
+? 重復1次或更多次,但盡可能少重復
?? 重復0次或1次,但盡可能少重復
{n,m}? 重復n到m次,但盡可能少重復
{n,}? 重復n次以上,但盡可能少重復

貪婪匹配:

  在使整個表達式能得到匹配的前提下,匹配盡可能多的字符
  a.*b,它將會匹配最長的以a開始,以b結束的字符串。如果用它來搜索aabab的話,它會匹配整個字符串aabab。

懶惰(非貪婪)匹配:

  也就是匹配盡可能少的字符,《2.必記的常用限定符》提到的限定符都可以被轉化為懶惰匹配模式,只要在它後面加上一個問號?
  a.*?b匹配最短的,以a開始,以b結束的字符串

  如果把它應用於aabab的話,它會匹配aab(第一到第三個字符)和ab(第四到第五個字符)
  為什麽第一個匹配的是aab(第一到第三個字符)而不是ab(第二到第三個字符)?
  簡單地說,因為正則表達式有另一條規則,比懶惰/貪婪規則的優先級更高:最先開始的匹配擁有最高的優先權

5.非常用正則表達式元素

\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

附錄:
正則表達式本地及在線測試工具、MSDN官方正則表達式在線文檔

MSDN正則表達式語言 - 快速參考

Regester正則表達式測試工具-綠色版.zip

Regester正則表達式測試工具-安裝版.zip

編寫正則表達式時,時時點亮匹配到的文本(但不支持中文,有點遺憾)

很牛逼的一個在線正則匹配網站,時時點亮加支持中文

IP地址匹配: ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

(\d{1,3}\.){3}\d{1,3}是一個簡單的IP地址匹配表達式。表達式順序分析:

\d{1,3}匹配1到3位的數字,

(\d{1,3}\.){3}匹配三位數字加上一個英文句號(這個整體也就是這個分組)重復3次,

最後再加上一個一到三位的數字(\d{1,3})

玩轉正則表達式(Regular),這個世界正在獎勵偷偷用心的人