正規表示式

2021-07-14 14:08:29 字數 4020 閱讀 8073

常用的元字元如下:

.匹配除換行符以外的任意字元

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

\s匹配任意的空白符

\d匹配數字

\b匹配單詞的開始或結束

^匹配字串的開始

$匹配字串的結束

*                     重複零次或更多次

+                    重複一次或更多次

?                    重複零次或一次

重複n次

重複n次或更多次

重複n到m次

\轉義字元(用以取消前面所述元字元的特殊意義)

[xyz]                匹配所包含的任意乙個字元

[^xyz]               匹配未包含的任意字元

[a-z]                匹配指定範圍內的任意字元

[^a-z]               匹配任何不在指定範圍內的任意字元。

常用的反義**:

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

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

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

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

[^x]

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

[^aeiou]            

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

常用分組語法:

(exp)

匹配exp,並捕獲文字到自動命名的組裡

(?exp)      

匹配exp,並捕獲文字到名稱為name的組裡,也可以寫成(?'name'exp)

(?:exp)

匹配exp,不捕獲匹配的文字,也不給此分組分配組號

(?=exp)

匹配exp前面的位置

(?<=exp)

匹配exp後面的位置

(?!exp)

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

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

(?#comment)          

注釋,

用於提供注釋讓人閱讀

懶惰限定符:

*?重複任意次,但盡可能少重複

+?重複1次或更多次,但盡可能少重複

??重複0次或1次,但盡可能少重複

?           

重複n到m次,但盡可能少重複

?重複n次以上,但盡可能少重複

其他常用的語法:

\a                                      報警字元(列印它的效果是電腦嘀一聲)

\b通常是單詞分界位置,但如果在字元類裡使用代表退格

\t製表符,tab

\r回車

\v豎向製表符

\f換頁符

\n                                      換行符

\eescape

\0nn                                  ascii**中八進位制**為nn的字元

\xnnascii**中十六進製制**為nn的字元

\unnnnunicode**中十六進製制**為nnnn的字元

\cnascii控制字元。比如\cc代表ctrl+c

\a                                          字串開頭(類似^,但不受處理多行選項的影響)

\z字串結尾或行尾(不受處理多行選項的影響)

\z                                           字串結尾(類似$,但不受處理多行選項的影響)

\g當前搜尋的開頭

\p                            unicode中命名為name的字元類,例如\p

(?>exp)貪婪子表示式

(?-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

\b是正規表示式規定的乙個特殊**,代表著單詞的開頭或結尾,也就是單詞的分界處。雖然通常英文的單詞是由空格,標點符號或者換行來分隔的,但是\b並不匹配這些單詞分隔字元中的任何乙個,它只匹配乙個位置。如精血查詢乙個單詞love,則需要使用\blove\b。

假如love後面不遠處跟著乙個you,則應該使用\blove\b.*\byou\b,其中「.」表示匹配除了換行符以外的任意字元,「*」表示*前邊的內容可以連續重複出現任意次以使整個表示式得到匹配,即「.*」連在一起就意味著匹配任意數量的不包含換行的字元。

\d匹配一位數字(0,或1,或2,或……),如0\d-\d表示最前面的是數字0,緊接著是兩個任意的數字,連線符-,最後是8個任意的數字,\d後面的()的意思是前面\d必須連續重複匹配2次(8次)。則是重複的次數不能少於5次,不能多於12次。

\s匹配任意的空白符,包括空格,製表符(tab),換行符,中文全形空格等。\w匹配字母或數字或下劃線或漢字等。+則匹配重複1次或更多次。

例1:\(?0\d[) -]?\d可以匹配幾種格式的**號碼,像(010)88886666,或022-22334455,或02912345678等。首先是乙個轉義字元\(,它能出現0次或1次(?),然後是乙個0,後面跟著2個數字(\d),然後是)或-或空格中的乙個,它出現1次或不出現(?),最後是8個數字(\d)。但是這樣寫會導致出現010)12345678或(022-87654321這樣的「不正確」的格式。為此,我們需要採用分支條件(指的是有幾種規則,如果滿足其中任意一種規則都應該當成匹配,具體方法是用|把不同的規則分隔開。)修改我們的表示式:\(0\d\)[- ]?\d|0\d[- ]?\d

例2,ip位址匹配表示式(如何重複多個字元--分組):((2[0-4]\d|25[0-5]|[01]?\d\d?)\.)(2[0-4]\d|25[0-5]|[01]?\d\d?)

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

從左向右,以分組的左括號為標誌,第乙個出現的分組的組號為1,第二個為2,以此類推。後向引用用於重複搜尋前面某個分組匹配的文字。例如:

\1:代表分組1匹配的文字。

貪婪原則:預設的是匹配盡可能多的字元;懶惰原則:匹配盡可能少的字元,只要在貪婪表示式的後面新增乙個?即可。

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

非負整數 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正規表示式 編寫正規表示式

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