1. 程式人生 > >正則表示式的使用知識

正則表示式的使用知識

一、元字元

1.     \b     元字元    開頭和結尾

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

3.     *      元字元    指定*前邊的內容可以連續重複使用任意次以使整個表示式得到匹配(0次或多次)

4.     \d     元字元    匹配一位數字

5.     -                匹配連字元本身

6.     字串           匹配字串本身

7.     \d\d\d\d\d\d  等同於  \d{6}

8.     \s     元字元    匹配任意的空白符,包括空格,製表符(Tab),換行符,中文全形空格

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

10.    +      元字元    匹配1個或更多(1次或多次)

11.    ^     元字元    匹配字串的開始

12.    $     元字元    匹配字串的結束

(^$與\b的區別是:前者,必須這個字串完全符合^$中間的規則。後者,這個字串只要有匹配的部分就可以)

13.    ?     元字元    匹配零次或一次(0或1)

14.    {n} {n,} {n,m}   指定重複次數(左閉右閉區間)

15.    []     元字元?

16.    ()   元字元

 

二、字元轉義

查詢元字元本身,需要使用\來解釋元字元,\可以取消元字元的特殊意義

 

三、字元類

使用[]包含想要匹配的字串

[0-9]代表\d 

[a-z0-9A-Z_]也完全等同於\w(如果只考慮英文的話)

 

四、分枝條件(|)

|

使用分枝條件時,要注意各個條件的順序

匹配分枝條件時,將會從左到右地測試每個條件,如果滿足了某個分枝的話,就不會去再管其它的條件了

 

五、分組

()

(\d{1,3}\.){3}\d{1,3}是一個簡單的IP地址匹配表示式

 

六、反義

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

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

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

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

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

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

 


七、後向引用

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

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

 

 

分組0對應整個正則表示式

實際上組號分配過程是要從左向右掃描兩遍的:第一遍只給未命名組分配,第二遍只給命名組分配--因此所有命名組的組號都大於未命名的組號

你可以使用(?:exp)這樣的語法來剝奪一個分組對組號分配的參與權.

 


八、常用分組語法

分類       程式碼/語法        說明

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

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

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

零寬斷言   (?=exp)          匹配exp前面的位置

            (?<=exp)        匹配exp後面的位置

            (?!exp)          匹配後面跟的不是exp的位置

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

註釋       (?#comment)      這種型別的分組不對正則表示式的處理產生任何影響,用於提供註釋讓人閱讀

 

九、零寬斷言

\b\w+(?=ing\b)    匹配以ing結尾的單詞的前面部分(除了ing以外的部分)

(?<=\bre)\w+\b    匹配以re開頭的單詞的後半部分(除了re以外的部分)

負向零寬斷言

(?<=<(\w+)>).*(?=<\/\1>)    匹配不包含屬性的簡單HTML標籤內裡的內容

 

十、註釋

(?#comment)來包含註釋。例如:2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)。

 

十一、貪婪與懶惰

貪婪 匹配儘可能多

a.*b

懶惰 匹配儘可能少

a.*?b  即數量符號後面加上?

 

十二、處理選項

IgnoreCase(忽略大小寫)                 匹配時不區分大小寫。

Multiline(多行模式)                     更改^和$的含義,使它們分別在任意一行的行首和行尾匹配,而不僅僅在整個字串的開頭和結尾匹配。(在此模式                                        下,$的精確含意是:匹配\n之前的位置以及字串結束前的位置.)

Singleline(單行模式)                   更改.的含義,使它與每一個字元匹配(包括換行符\n)。

IgnorePatternWhitespace(忽略空白)       忽略表示式中的非轉義空白並啟用由#標記的註釋。

ExplicitCapture(顯式捕獲)               僅捕獲已被顯式命名的組。

 

十三、平衡組/遞迴匹配

匹配HTML    <div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>

附錄:常見正則表示式

1、js端

// [^\da-zA-Z0-9\u4e00-\u9fa5_-]表示除了【數字中文字大小寫字母_-】外的任意字元   /g是替換的意思

// 此句完整意思就是 替換value中所有非【數字中文字大小寫字母_-】的字元為【""】

var temp = value.replace(/[^\da-zA-Z0-9\u4e00-\u9fa5_-]/g, "");   

 

 

2、java端

\u00A0和\u3000分別代表著半形和全形空格

(\d{1,3}\.){3}\d{1,3} IP地址

^([^\.]*([a-zA-Z0-9\u4e00-\u9fa5]+\.)*[^\.]*)*$ IP地址加強版


---------------------
作者:IceDarron
來源:CSDN
原文:https://blog.csdn.net/darron_r/article/details/52718526