正則表達式做爲一個強大的字符匹配工具,應該是咱們每一個程序猿都應該掌握的工具。使用正則表達式能夠很是靈活的處理咱們須要匹配到的字串而沒必要使用contain()、index()等方法屢次的操做,下面就來介紹一些經常使用的正則表達式。正則表達式
最簡單的匹配就是你給什麼樣的字符就匹配什麼樣的字符,例如若想在「hello world hello」中匹配「hello」的話 ,那麼就只會匹配到hello這個字符。這裏有個須要注意的就是絕大多數的正則表達式引擎只會返回第一個匹配到的結果,若是須要匹配全部的字符,不一樣的引擎有不一樣的處理方法可供調用。工具
若是隻想匹配任意一個單個字符,可使用正則表達式中的元字符".",這個字符表示能夠匹配任意的一個字符·。注意全部的元字符在正則表達式中都有特殊的定義,若是想匹配字符自己須要加上轉義字符"",例如 \.url
若是想要匹配一組字符中的任意一個,可使用[ ]表示法。使用[]表示匹配括號中的任意一個字符,這裏有個須要注意點就是方括號中的元字符不須要轉義,它只表明它自己。例如[abcde.]匹配這些字符中的任意一個。文檔
方括號還有一種特殊的語法,能夠表示字符區間。例如想要匹配全部的數字可使用[0-9]表示全部的數字,[a-z]表示全部的小寫字母。-連字符是在方括號中的一種特殊元字符,在方括號外只表示符號自己不須要轉義。字符串
固然也能夠對一組字符取非操做,表示匹配不屬於該組字符中的任意一個。使用^表示取非,例如1表示匹配非數字字符。table
上面說過有有些字符在正則表示式中有特殊的含義,比較經常使用的元字符以下:class
元字符 | 含義 |
---|---|
d | 匹配任意一個數字字符,等價於[0-9] |
D | 匹配任意一個非數字字符,等價於[^ 0-9] |
w | 匹配任意一個字母字符或者下劃線,等價於[a-zA-Z_] |
W | 任何一個非字母或者下劃線,等價於[^a-zA-Z] |
s | 任何一個空白字符,等價於[fnrtv] |
S | 任何一個非空白字符,等價於[^fnrtv] |
對於某些字符,可能須要重複匹配的,正則表達式也提供了一些特殊元字符知足這些需求。ftp
元字符 | 含義 |
---|---|
+ | 匹配一個或者多個字符,例如w+表示匹配至少一個字符 |
* | 匹配任意多個字符 |
? | 匹配零個或者一個字符,也就是最多出現一次 |
除了上面的任意匹配次數以外,咱們還能夠規定匹配次數的範圍。這是使用{ }大括號實現的。語法
一個字符只須要出現3次,例如咱們的電話號碼,13112345678,,只要使用"d{8}"匹配便可。引用
一樣能夠設定一個匹配的最小和最大匹配次數, 例如d{3,8}
規定了最小值,沒有最大值表示最少匹配多少次,能夠省略最大值表示d{3,}
在重複匹配中有個須要特別注意的地方,咱們的重複匹配的元字符默認都是貪婪型的,也就是匹配的越多越好。好比有個字符串以下,「ahb<kjlaf[]>lacanj>」,咱們想要匹配"< >"之間的全部字符,使用模式"<.*>"匹配,最後獲得結果是<kjlaf[]>lacanj>,並無在第一次遇到">"的時候結束匹配而是選擇了最長的匹配,這就是貪婪型的匹配。相對於貪婪型的匹配,還有一種懶惰型的匹配,使用元字符?表示。
貪婪型 | 懶惰型 |
---|---|
* | *? |
+ | +? |
{n,} | {n,}? |
b 用來匹配一個單詞的開始或者結尾。
B 用來匹配不是一個單詞邊界
用來定義字符串邊界的元字符有兩個:匹配字符串開頭的^,匹配字符串結尾的$.
分行匹配模式使得正則表達式引擎把行分隔符看成一個字符串分隔符來對待。在分行匹配模式下,^能夠匹配每一行的開始,$能夠匹配每一行的末尾。在使用時候(?m)必須出如今匹配模式的開頭部分。
對於前面提到的一些元字符,它們有一個限制,就是這些字符只能修飾它旁邊的一個字符,若是須要修飾的是一段字符的話就須要使用子表達式了。把一個表達式劃分爲一系列的子表達式,這些子表達式能夠當成獨立的元素使用,子表達式使用()括起來。好比須要檢測有多個abc字符的重複模式能夠寫做"(abc)+".
還有一種是管道符號 |,這個符號表示多個字符序列中的任意一個序列,例如19|20d{2},表示的就是以19或者是20開頭的任意4個數字。
有些狀況下咱們須要匹配的字符後半段是依賴前半段的。好比<h1>ghflahgfla</h1><h2>jlhgoiy</h2>,咱們須要匹配的字符是h[n]標籤的內容,若是使用h[1-9]w*h[1-9]這樣的模式是能夠匹配到,可是碰到像<h1>gagofgao<h2>這樣的錯誤的標籤使用該模式依然能夠匹配獲得。像這種依賴與前面的匹配字符的形式咱們須要使用回溯引用的方式。
仍是這個例子,咱們能夠這樣匹配 (h[1-9])w*1,這裏有一個1是什麼意思呢? 對於這個符號前面的子表達式也就()擴起來的模式,,咱們能夠按照前後順序一次標註爲1,2,3....等等,1表示的就是第一個匹配到的子表達式的值。也就是若是匹配到的是h1,那麼後面1表明的就是h1.
對於一些須要匹配的結果,咱們預先不知道它的值,只知道它出如今一些特殊標記的區間內,好比獲取全部url中全部的schema模式,如ftp://,http://,https://等等,這個時候可使用先後查找。
還有一些比較高級的用法,使用的場景很少,使用上面的語法基本能夠對付經常使用的模式匹配。
參考文檔:
<正則表達式必知必會>