正則表達式入門

作者: 思考之驢  來源: 博客園  發布時間: 2010-12-05 14:55  閱讀: 1471 次  推薦: 0   原文鏈接   [收藏]  

1. 常用的元字符

. 匹配除換行符以外的任意字符
\w 匹配字母或數字或下劃線
\s 匹配任意的空白符
\d 匹配數字
\b 匹配單詞的開始或結束
^ 匹配字符串的開始
$ 匹配字符串的結束
比如一個網站如果要求你填寫的QQ號必須為5位到12位數字時,可以使用:^\d{5,12}$。

 

2. 常用的限定符
* 重復零次或更多次
+ 重復一次或更多次
? 重復零次或一次
{n} 重復n次
{n,} 重復n次或更多次
{n,m} 重復n到m次
13\d{9} 匹配13后面跟9個數字(中國的手機號)

3. 常用的反義代碼
\W 匹配任意不是字母、數字、下劃線的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非數字的字符
\B 匹配不是單詞開頭或結束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou這幾個字母以外的任意字符
<a[^>]+> 匹配用尖括號括起來的以a開頭的字符串。

\S+ 匹配不包含空白符的字符串。

4. 分組:你可以用小括號來指定子表達式(也叫做分組),
分組語法
捕獲
(exp) 匹配exp, 并捕獲文本到自動命名的組里
(?<name>exp) 匹配exp, 并捕獲文本到名稱為name的組里,也可以寫成(?'name'exp)
(?:exp) 匹配exp, 不捕獲匹配的文本,也不給此分組分配組號
零寬斷言
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
注釋
(?#comment) 這種類型的組不對正則表達式的處理產生任何影響,用于提供注釋讓人閱讀

5. 懶惰限定符 *? 重復任意次,但盡可能少重復
+? 重復1次或更多次,但盡可能少重復
?? 重復0次或1次,但盡可能少重復
{n,m}? 重復n到m次,但盡可能少重復
{n,}? 重復n次以上,但盡可能少重復
a.*?b 匹配最短的,以a開始,以b結束的字符串。

a.*b,它將會匹配最長的以a開始,以b結束的字符串

6. 常用的處理選項
IgnoreCase(忽略大小寫) 匹配時不區分大小寫。
Multiline(多行模式) 更改^和$的含義,使它們分別在任意一行的行首和行尾匹配,而不僅僅在整個字符串的開頭和結尾匹配。(在此模式下,$的精確含意是:匹配\n之前的位置以及字符串結束前的位置.) 
Singleline(單行模式) 更改.的含義,使它與每一個字符匹配(包括換行符\n)。 
IgnorePatternWhitespace(忽略空白) 忽略表達式中的非轉義空白并啟用由#標記的注釋。
RightToLeft(從右向左查找) 匹配從右向左而不是從左向右進行。
ExplicitCapture(顯式捕獲) 僅捕獲已被顯式命名的組。
ECMAScript(JavaScript兼容模式) 使表達式的行為與它在JavaScript里的行為一致。

7. 平衡組/遞歸匹配
(?'group') 把捕獲的內容命名為group, 并壓入堆棧 。
(?'-group') 從堆棧上彈出最后壓入堆棧的名為group的捕獲內容,如果堆棧本來為空,則本分組的匹配失敗。
(?(group)yes|no) 如果堆棧上存在以名為group的捕獲內容的話,繼續匹配yes部分的表達式,否則繼續匹配no部分。
(?!) 零寬負向先行斷言,由于沒有后綴表達式,試圖匹配總是失敗
<                         #最外層的左括號
    [^<>]*                #最外層的左括號后面的不是括號的內容
    (
        (
            (?'Open'<)    #碰到了左括號,在黑板上寫一個"Open"
            [^<>]*       #匹配左括號后面的不是括號的內容
        )+
        (
            (?'-Open'>)   #碰到了右括號,擦掉一個"Open"
            [^<>]*        #匹配右括號后面不是括號的內容
        )+
    )*
    (?(Open)(?!))         #在遇到最外層的右括號前面,判斷黑板上還有沒有沒擦掉的"Open";如果還有,則匹配失敗
>                         #最外層的右括號平衡組的一個最常見的應用就是匹配HTML
下面這個例子可以匹配嵌套的<div>標簽:<div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>.

8. 尚未詳細討論的語法 

\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

0
0
 
 
 

文章列表

全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()