正規表示式

2021-08-03 21:13:37 字數 3437 閱讀 7007

常用的限定符

.匹配任何字元(除了換行符以外的任意字元)*

前面的內容可以出現任意次(>=0)

+前面的內容可以出現任意次(>=1)

?前面的內容可以出現0次或1次

\d數字

前面的內容出現n次

\w字母或數字或下劃線或漢字

^字串開頭

$字串結尾 \w

匹配任意不是字母,數字,下劃線,漢字的字元

\s匹配任意不是空白符的字元

\d匹配任意非數字的字元

\b匹配不是單詞開頭或結束的位置

[^x]

匹配除了x以外的任意字元

[^aeiou]

匹配除了aeiou這幾個字母以外的任意字元

使用小括號指定乙個子表示式後,匹配這個子表示式的文字(也就是此分組捕獲的內容)可以在表示式或其它程式中作進一步的處理。預設情況下,每個分組會自動擁有乙個組號,規則是:從左向右,以分組的左括號為標誌,第乙個出現的分組的組號為1,第二個為2,以此類推。

後向引用用於重複搜尋前面某個分組匹配的文字。例如,\1代表分組1匹配的文字。

\b(\w+)\b\s+\1\b可以用來匹配重複的單詞,像go go, 或者kitty kitty。這個表示式首先是乙個單詞,也就是單詞開始處和結束處之間的多於乙個的字母或數字(\b(\w+)\b),這個單詞會**獲到編號為1的分組中,然後是1個或幾個空白符(\s+),最後是分組1中捕獲的內容(也就是前面匹配的那個單詞)(\1)。

你也可以自己指定子表示式的組名。要指定乙個子表示式的組名,請使用這樣的語法:(?\w+)(或者把尖括號換成'也行:(?'word'\w+)),這樣就把\w+的組名指定為word了。要反向引用這個分組捕獲的內容,你可以使用\k,所以上乙個例子也可以寫成這樣:

\b(?\w+)\b\s+\k\b。

(?=exp)

匹配exp前面的位置

(?<=exp)

匹配exp後面的位置

(?!exp)

匹配後面跟的不是exp的位置

(?匹配前面不是exp的位置

(?#comment)

這種型別的分組不對正規表示式的處理產生任何影響,用於提供注釋讓人閱讀

(?=exp)也叫零寬先行斷言,它匹配文字中的某些位置,這些位置的後面能匹配給定的字尾exp。比如\b\w+(?=ing\b),匹配以ing結尾的單詞的前面部分(除了ing以外的部分),如果在查詢i'm singing while you're dancing.時,它會匹配sing和danc。

(?<=exp)也叫零寬後行斷言,它匹配文字中的某些位置,這些位置的前面能給定的字首匹配exp。比如(?<=\bre)\w+\b會匹配以re開頭的單詞的後半部分(除了re以外的部分),例如在查詢reading a book時,它匹配ading。

假如你想要給乙個很長的數字中每三位間加乙個逗號(當然是從右邊加起了),你可以這樣查詢需要在前面和裡面新增逗號的部分:((?<=\d)\d)*\b。請仔細分析這個表示式,它可能不像你第一眼看出來的那麼簡單。

下面這個例子同時使用了字首和字尾:(?<=\s)\d+(?=\s)匹配以空白符間隔的數字(再次強調,不包括這些空白符)。

(?=exp)也叫

零寬度正**先行斷言,它

斷言自身出現的位置的後面能匹配表示式exp。比如

\b\w+(?=ing\b),匹配

以ing結尾的單詞的前面部分(除了ing以外的部分),如查詢

i'm singing while you're dancing.時,它會匹配

sing和

danc。

(?<=exp)也叫零寬度正回顧後發斷言,它斷言自身出現的位置的前面能匹配表示式exp。比如(?<=\bre)\w+\b會匹配以re開頭的單詞的後半部分(除了re以外的部分),例如在查詢reading a book時,它匹配ading。

零寬度負**先行斷言

(?!exp),斷言此位置的後面不能匹配表示式exp。

例如:\d(?!\d)匹配三位數字,而且這三位數字的後面不能是數字;\b((?!abc)\w)+\b匹配不包含連續字串abc的單詞。

我們可以用(?,零寬度負回顧後發斷言來斷言此位置的前面不能匹配表示式exp:(?匹配前面不是小寫字母的七位數字。乙個更複雜的例子:(?<=<(\w+)>).*(?=<\/\1>)匹配不包含屬性的簡單html標籤內裡的內容。(?<=<(\w+)>)指定了這樣的字首:被尖括號括起來的單詞(比如可能是),然後是.*(任意的字串),最後是乙個字尾

(?=<\/\1>)。注意字尾裡的\/,它用到了前面提過的字元轉義;\1則是乙個反向引用,引用的正是捕獲的第一組,前面的(\w+)匹配的內容,這樣如果字首實際上是的話,字尾就是了。整個表示式匹配的是之間的內容(再次提醒,不包括字首和字尾本身)。

小括號的另一種用途是通過語法

(?#comment)來包含注釋。例如:

2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)。

當正規表示式中包含能接受重複的限定符時,通常的行為是(在使整個表示式能得到匹配的前提下)匹配盡可能多的字元。以這個表示式為例:

a.*b,它將會匹配

最長的以a開始,以b結束的字串。如果用它來搜尋

aabab的話,它會匹配整個字串

aabab。這被稱為

貪婪匹配。

有時,我們更需要懶惰匹配,也就是匹配盡可能少的字元。前面給出的限定符都可以被轉化為懶惰匹配模式,只要在它後面加上乙個問號?。這樣.*?就意味著匹配任意數量的重複,但是在能使整個匹配成功的前提下使用最少的重複。

a.*?b匹配最短的,以a開始,以b結束的字串。如果把它應用於aabab的話,它會匹配aab(第一到第三個字元)和ab(第四到第五個字元)

匹配像 

xx aa> yy

這樣的可巢狀的層次性結構。

<                         #最外層的左括號

[^<>]* #最外層的左括號後面的不是括號的內容((

(?'open'<) #碰到了左括號,在黑板上寫乙個"open"

[^<>]* #匹配左括號後面的不是括號的內容)+(

(?'-open'>) #碰到了右括號,擦掉乙個"open"

[^<>]* #匹配右括號後面不是括號的內容

)+)*

(?(open)(?!)) #在遇到最外層的右括號前面,判斷黑板上還有沒有沒擦掉的"open";如果還有,則匹配失敗

> #最外層的右括號

平衡組的乙個最常見的應用就是匹配html,下面這個例子可以匹配巢狀的標籤:]*>[^<>]*(((?'open']*>)[^<>]*)+((?'-open'

)[^<>]*)+)*(?(open)(?!))

.

正規表示式 正規表示式 總結

非負整數 d 正整數 0 9 1 9 0 9 非正整數 d 0 負整數 0 9 1 9 0 9 整數 d 非負浮點數 d d 正浮點數 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 非正浮點數 d d 0 0 負浮點數 正浮點數正則式 英文本串 a za z...

正規表示式 表示式

網域名稱 a za z0 9 a za z0 9 a za z0 9 a za z0 9 interneturl a za z s 或 http w w w 手機號碼 13 0 9 14 5 7 15 0 1 2 3 5 6 7 8 9 18 0 1 2 3 5 6 7 8 9 d 號碼 x x x...

Linux正規表示式 編寫正規表示式

為了所有實用化的用途,你可以通過使用程式產生正確的結果。然而,並不意味著程式總是如你所願的那樣正確地工作。多數情況下,如果程式不能產生想要的輸出,可以斷定真正的問題 排除輸入或語法錯誤 在於如何描述想要的東西。換句話說,應該考慮糾正問題的地方是描述想要的結果的表示式。表示式不完整或者公式表示得不正確...