字符轉義
如何在目標字符串裏面查找元字符呢?比如”.””*”,如果直接在正則表達式裏面直接使用肯定是不行的。
正則表達式這裏處理的辦法和 一般編程語言處理方式相類似,直接使用\來取消它的元字符地位,於是,可以在元字符裏面可以這樣使用:”\.”或者”\*”。
查找未被預定義的字符
標題的意思是說,如果想要查找的字符沒有相對應的元字符來處理怎麼辦?在正則表達式裏面我們使用中括號[]來處理,你只要在中括號裏面列舉你想要查找的字符就可以了。例如查找0~9的數字和w字符:
分支條件
首先來看一個例子:
\(?0\d{2}[) -]?\d{8}
上面的(和)也是元字符,這裏使用了\轉義符,後面跟了?符號,所以表示的查找的就是有括號或者沒有括號開頭的字符串。分解如下:
\(? 0\d{2}[) -]? \d{8}
可以匹配類似於(010)88886666或022-22334455, 或02912345678等多種字符串。如果你想要查找電話號碼的話,那就問題大了,因上面這個表達式還有可能匹配類似於010)12345678或(022-87654321這種字符串。
怎麼解決上面的問題呢?
答案當然是給上述的正則表達式使用更加精準的限制條件。這裏我們使用分支條件。
所謂分支條件是指:多種規則並列共同構成一個正則表達式,只要字符串匹配符合其中一個規則,就算找到一個字符串,多個規則之間使用|符號來分開。
以上面的例子來說明:\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}。
在使用分支條件的時候,要注意各個條件之間的順序,因爲正則表達式工作的時候是從左到右來匹配的,如果某個字符串符合第一條規則,就直接跳出了,不會再去管。例如可以比較試下\d{5}-\d{4}|\d{5}和\d{5}|\d{5}-\d{4}的區別。
分組
先來看兩個例子:
\d{3}表示數字重複三次。
\w{4}表示匹配4位字符的單詞(\w的意義表示0~9,A~Z,a~z等請看前章節)。
現在,提問:要是想指定HG這兩個字符重複多次怎麼辦?或者其他任意指定的字符重複多次怎麼辦?
正則表達式裏面使用 分組 來解決這個問題。
分組,或者叫做子表達式,在正則表達式裏面使用小括號來指定,包含在小括號裏面的字符就是一個分組,你可以對它們的重複次數做處理。小括號前面說過,也是元字符。
例如,匹配IP地址:
(\d{1,3}\.){3}\d{1,3}
可以這樣分解:
(\d{1,3}\.){3} \d{1,3}
小括號裏面的意思是1~3位數字外加一個點;小括號後面跟了個{3}表示子表達式必須重複3次。橙色的表示1~3位數字。
反義
前面已經提到了分組這個好東西,用着也還順手,現在又有新的問題了,萬一我想查找a~z,A~Z這52個字符怎麼辦?難道要將他們全部都寫進子表達式麼?有沒有好的辦法呢?這裏使用到了反義。
聯繫前面學過的元字符,反義其實就是把他們的元字符大寫。具體如下:
代碼 | 詳解 |
\W | 匹配任意不是字母,數字,下劃線,漢字等等的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意不是數字的字符 |
\B | 匹配任意不是單詞開頭或者結尾的位置 |
[^X] | 匹配除了X以外的任意字符 |
[^aieou] | 匹配除了aieou幾個字母以外的任意字符 |
例如:\S+表示不包含空白符的字符串(至少有一個字符)。