對於任何有過編程經驗的人來講,他對正則表達式應該不會感到陌生。php
正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),能夠用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。正則表達式
平時沒有系統地學習過正則表達式的知識,多數狀況都是在使用到時,纔會查找相關的語法來實現需求。最近對 PHP 的正則表達式進行了一次主題閱讀,收穫良多,特地寫篇筆記記錄下來。express
PHP 中有兩種類型的函數來處理正則表達式,一種是由 PCRE 庫提供的函數,它們是以 preg_
前綴開頭的;另外一種是 由 POSIX 擴展提供的函數,它們是以 ereg_
前綴開頭。可是從 PHP5.3.0 開始後者便再也不建議使用,故而如下的知識都是針對 PCRE 模式的。編程
PHP 中的正則表達式由如下三部分組成:函數
例如:學習
/[a-zA-Z0-9-_]+/m
上面的例子當中:
字符串收尾的/
屬於正則表達式的分隔符,它能夠是任意的非字母數字、非反斜線、非空白字符;
分隔符中間部分[a-zA-Z0-9-_]+
屬於正則表達式的表達式;
正則表達式最後的部分m
是修飾符,這裏的m
表示多行選擇。測試
正則表達式的威力源於它能夠在模式中擁有選擇和重複的能力。 一些字符被賦予 特殊的涵義,使其再也不單純的表明本身,模式中的這種有特殊涵義的編碼字符 稱爲 元字符。編碼
元字符 | 含義 |
\ |
通常用於轉義字符 |
^ |
斷言目標的開始位置(或在多行模式下是行首) |
$ |
斷言目標的結束位置(或在多行模式下是行尾) |
. |
匹配除換行符外的任何字符(默認) |
[ |
開始字符類定義 |
] |
結束字符類定義 |
| |
開始一個可選分支 |
( |
子組的開始標記 |
) |
子組的結束標記 |
? |
做爲量詞,表示 0 次或 1 次匹配。位於量詞後面用於改變量詞的貪婪特性。 (查閱量詞) |
* |
量詞,0 次或屢次匹配 |
+ |
量詞,1 次或屢次匹配 |
{ |
自定義量詞開始標記 |
} |
自定義量詞結束標記 |
左方括號開始一個字符類的描述,並以方中括號結束。 單獨的一個右方括號沒有特殊含義。若是一個右方括號須要做爲一個字符類中的成員, 那麼能夠將它寫在字符類的首字符處(若是使用了^取反, 那麼是第二個)或者使用轉義符。
一個字符類在目標字符串中匹配一個單獨的字符; 該字符必須是字符類中定義的字符集合的其中一個, 除非使用了 ^ 對字符類取反。 .net例如:
[\d]
匹配全部的數字[^\d]
匹配全部的數字以外的字符code
豎線字符用於分離模式中的可選路徑。 豎線能夠在模式中出現任意多個,而且容許有空的可選路徑(匹配空字符串)。 匹配的處理從左到右嘗試每個可選路徑,而且使用第一個成功匹配的。
好比:
模式gilbert|Sullivan
匹配gilbert
或者sullivan
。
子組經過圓括號分隔界定,而且它們能夠嵌套。子組具備兩個做用:
一、 將可選分支局部化;
二、 將子組設定爲捕獲子組。好比:
模式cat(arcat|erpillar|)
匹配cat
,cataract
,caterpillar
中的一個
在反斜線後面加一個大於零的數字能夠引用模式前面捕獲的內容,這叫作後向引用。
若是緊跟反斜線的數字小於 10, 它老是一個後向引用, 而且若是在模式中沒有這麼多的捕獲組會引起一個錯誤。例如:
模式(sens|respons)e and \1ibility
將會匹配sense and sensibility
和response and responsibility
, 但不會匹配sense and responsibility
。
一個斷言就是一個對當前匹配位置以前或以後的字符的測試, 它不會實際消耗任何字符。它有兩種類型: 前瞻斷言(從當前位置向前測試)和後瞻斷言(從當前位置向後測試);每一個類型又有確定斷言和否認斷言之分。
因此共有如下四種斷言:
一、前瞻確定斷言(?=
二、前瞻否認斷言(?!
三、後瞻確定斷言(?<=
四、後瞻否認斷言(?<!
例如:
\w+(?=;)
匹配一個單詞緊跟着一個分號可是匹配結果不會包含分號foo(?!bar)
匹配全部後面沒有緊跟bar
的foo
字符串(?<!foo)bar
用於查找任何前面不是foo
的bar
當正則表達式中包含能接受重複的限定符時,默認的行爲是(在使整個表達式能獲得匹配的前提下)匹配儘量多的字符。這被稱爲貪婪匹配。
例如:
以a.*b
來搜索aabab
時,它會匹配整個字符串aabab
。
但是咱們的需求並不是一直是要貪婪匹配的,有時候也會選擇懶惰的匹配模式。其實在量詞後面緊跟着 ?
即爲懶惰模式。*?
+?
{n,m}?
皆爲懶惰匹配。
例如:
以a.*?b
來搜索aabab
時,它會匹配字符串aab
和ab
。
i
忽略大小寫模式m
多行模式s
點號通配模式U
懶惰模式D
結尾限制u
支持 UTF-8 轉義表達