通用正則表達式


區別於常見的正則表達式教程,本教程讓你快速入門,並規避常見問題。

(大家可以閱讀完后邊的教程再閱讀注意事項,注意事項放在前邊只是為了引起注意)

在開始之前先說一些值得大家注意的事項吧

1 正則表達式沒有邏輯與、邏輯非關系。那么要實現邏輯與,就要靠表達式序列來實現了,也就是組合。而邏輯非要靠零寬斷言來實現了,但是不幸的是,現在大多數工具對斷言啊,分組捕獲啊,的支持並不完整。比如sed,是不支持斷言的。

2 正則表達式的邏輯或關系,在正則表達式中是靠多選來實現的。

3 請謹遵語法,對於那些用慣了一個*來代表若干字符的,請注意,這並不是標准的正則表達式,而是一些工具自己內部封裝的特殊符號。

4 注意匹配的范圍,正則表達式默認是匹配最大范圍,就是說大家要考慮匹配句子?匹配單詞?匹配單詞的一部分?比如有以下的文本行,int main(int argc... ,對於表達式.*t\b將匹配以下內容 int main(int,而如果你用\w*t\b,將只匹配2個int,更嚴謹的表達方式是\b\w*t\b。所以建議大家盡可能使用代表小范圍的通配符(元字符)。

5 至於貪婪和懶惰啊,遞歸啊,這些在某些語言中有支持,但是這個因為語言差異太大,本文不作詳述。

一些符號注意事項

1 - 連字符,這個只在字符組內有特殊意義,在字符組外代表字符本身。

2 ^ 脫字符,在字符組內的最前位置時表示排除的意思,在字符組內的其它位置表示字符本身,在字符組外則是通配符,表示行首。

3 . $ * + ? { } ( ) | ,在字符組內表示字符本身,在字符組外則是通配符或作用符。

4 字符組內,[ 和 ] 需要轉義

5 分組內,( 和 ) 需要轉義

正則表達式是記錄文本規則的代碼,主要的作用就是用於匹配文本。

語法:[內容][次數]

1 我們把一個內容和次數組成的塊叫小節,那正則表達式就是由若干個小節構成的。

2 內容后如果不加次數代表內容出現一次。

3 特定內容(位置元字符)后不應該跟次數。比如 ^ 和 $ 。

內容可以是普通字符、元字符、邏輯表達式和引用。

元字符表

    .     匹配除換行符以外的任意字符
    \w    匹配字母或數字或下划線或漢字
    \s    匹配任意的空白符
    \d    匹配數字
    \b    匹配單詞的開始或結束
    ^     匹配字符串的開始
    $     匹配字符串的結束
    \W    匹配任意不是字母,數字,下划線,漢字的字符
    \S    匹配任意不是空白符的字符
    \D    匹配任意非數字的字符
    \B    匹配不是單詞開頭或結束的位置

注意:其中\b、^、$、\B不代表任何字符位,他們代表一個位置,我們稱他們為位置元字符,其它元字符稱為占位元字符。

次數表

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

例:

    \d{5}     可以匹配 99999
    \w*ing    可以匹配 doing
    \w+ing    可以匹配 doing
    \w{2}ing  也可以匹配 doing

邏輯表達式

我們把邏輯表達式划分為組合、字符組、分組、多選。

組合

像 \w*ing 是由4個小節構成的,分別是\w*、i、n、g。

字符組

[]中括號擴起來的若干字符表示一個字符組,字符組內的字符是"或"的關系。

字符組內可使用連字符-。

注意:字符組后邊的次數,一般用 + 而不用 *,因為字符組后用 * 會匹配到出現0次的情況,這種情況會匹配到 \b 。

比如你想用字符組匹配2個單詞 int 或 argc,[(int)(argc)] 是錯誤的,這個代表2個分組,而分組內又是組合。集合內不能識別分組,將小括號識別為普通字符。

看來結果將不符合你的預期,這種邏輯建議使用或來表述 \bint\b|\bargc\b。

例:

    [int]      分別匹配字符i、n、t
    [0-9]      分別匹配0到9
    \b[int]+\b 可以匹配到單詞int、in、it

排除字符組

^ 表示排除

注意:如果你想在字符組內使用排除法去匹配一個單詞(見下面的例子),建議你在集合內加上 \W (大寫),否則空格和一些特殊字符也會被匹配到。

例:

    [^x]          匹配除了x以外的任意字符。
    [^aeiou]      匹配除了aeiou這幾個字母以外的任意字符
    \b[^int\W]\b  匹配不出現字符i、n、t的單詞,如果不加 \W ,空格和一些特殊字符就不被排除

分組

()用小括號括起來的子表達式

例:

    (\d{1,3}\.){3} 匹配999.999.999.

多選

| 表示"或"

注意:或的優先級低於其它任何邏輯表達式。可使用分組來提高或的優先級。

例:

    \bint|argc\b     除了可以匹配到 int 或 argc,還可以匹配到 inta 或 hargc內的部分字符
    \b(int|argc)\b   只匹配單詞 int 或 argc

轉義字符

\使用斜杠來顯現轉義字符。

所有的元字符、次數符、邏輯符號都需要轉義。

需轉義的字符有

    \ . ^ $ * + ? { } [ ] ( ) |

后向引用

引用允許在后邊的表達式中引用前邊捕獲到的分組的文本。

分組被捕獲,然后用\斜杠加數字引用捕獲到的內容。

命名捕獲在不同的語言中有不同的表示方法(Paython中使用(?P<name>group),.NET framework 中使用(?<name>group)),在這里不詳述。

例:

    \b(\w+)\b\s+\1\b  捕獲像 go go, 或者kitty kitty 這樣的疊詞

零寬斷言

斷言是一種判斷,就是判斷是否符合斷言表達式,符合時才匹配其它內容,不符合就不匹配。

注意:斷言的內容不被匹配,這也是為什么它們被稱為零寬的原因。

零寬斷言不能單獨存在,必須與非零寬的表達式組合。

不是所有的工具都支持所有的零寬斷言。

斷言表達式

    (?=exp)       匹配exp前面的位置
    (?<=exp)      匹配exp后面的位置
    (?!exp)       匹配后面跟的不是exp的位置
    (?<!exp)      匹配前面不是exp的位置

斷言分為正向斷言和負向斷言,上表前2個表達式是正向斷言,后2個表達式是負向斷言。

例:

    \b\w+(?=ing\b)    匹配以ing結尾的單詞
    (?<=\bre)\w+\b    匹配以re開頭的單詞
    \b((?!abc)\w)+\b  匹配不包含連續字符串abc的單詞
    (?<![a-z])\d{7}   匹配前面不是小寫字母的七位數字


免責聲明!

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



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