1. 正則表達式
正則表達式,又稱正規表示式、正規表示法、正規表達式、規則表達式、常規表示法(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列匹配某個句法規則的字符串。在很多文本編輯器里,正則表達式通常被用來檢索、替換那些匹配某個模式的文本。
------ From Wikipedia
正則表達式其實就是一組字符串,它是由字母、數字、符號組成按照一定的規則組成的。可以把正則表達式理解為一種“模式”,一般當需要對字符串進行處理,而自帶的函數(例如PHP自帶的字符串處理函數)滿足不了要求的時候,就會選擇使用正則表達式。使用正則表達式可以對指定的字符串進行查找、替換、分割等操作。
PHP 5.3.0之前支持兩種類型的正則表達式:
- POSIX正則表達式
- PERL正則表達式
POSIX正則表達式和PERL正則表達式的語法幾乎是相同的,它們之間的區別主要在于以下兩點:
1. 定界符
POSIX正則表達式沒有定界符,PERL正則表達式有定界符。
PERL正則表達式: /\d{4}\W\d{2}\W\d{2}/
POSIX正則表達式: \d{4}\W\d{2}\W\d{2}
以上的正則表達式都可以匹配類似于“2016-08-19”這樣的時間格式。在PERL正則表達式中開始和結束位置上的兩個字符"/",就是定界符。
2. 修正符
POSIX正則表達式沒有修正符,PERL正則表達式有修正符。
PERL正則表達式: /bob/i
POSIX正則表達式: bob
以上的正則表達式用來匹配特定的單詞,其中在PERL正則表達式中最后一個字符"i"就是修正符,它是對正則表達式的擴展,"i"表示忽略大小寫。也就是說PERL的正則表達式除了可以匹配含有bob的字符串,還可以匹配含有"Bob","BOB"等所有三個字母大小寫放在一起的組合的字符串。
但是PHP在5.3.0以后就不再支持POSIX風格的正則表達式,所以這里就介紹PERL正則表達式。
2.PERL正則表達式語法
一個PERL正則表達式可以由定界符、用于匹配的元素(原子)、元字符、模式修正符組成。
2.1 定界符
/\d{4}\W\d{2}\W\d{2}/
上面的正則表達式開始和結束位置上面兩個"/"就是定界符,定界符是正則表達式的邊界。規定除了數字、字母、反斜杠(\)不能用做定界符,其余的符號都可以用做定界符。常用的定界符就是"/"、"#"。
**2.2 用于匹配的元素(原子)**
>```
/a{2}\W\d{4}[h-z]/
顧名思義,用于匹配的元素是正則表達式中最基本的成員,它就是被拿來和目標字符串進行匹配的東西。在上面的正則表達式中"a{2}"、"\W"、"\d{4}"、"[h-z]"都是用于匹配的元素。在正則表達式中以下元素可以用做匹配的元素:
(1). 所有的數字、字母。 例如:1、2、3、a、b等。
(2). 被元字符修飾的數字或字母。例如:a{2}、[h-z]等。
(3). 元字符也可以用作匹配的字符,但是需要用轉義字符("")進行處理。例如:\* 、\+ 分別用來匹配*和+。
(4). 許多普通的字母被轉以字符修飾后表示一些特殊的含義也可以用作匹配的元素。例如:\w 表示匹配任意一個字,如字母、數字、下劃線。\W表示匹配任意一個非字。
2.3 元字符
元字符被用來修飾用于匹配的元素。不可以單獨出現!下面對常用的元字符進行總結。
(1) * 表示它前面的元素可以出現0次至多次。
(2) + 表示它前面的元素可以出現1次或者多次。
(3) ? 表示它前面的元素可以出現0次或者1次。
(4) . 可以匹配除換行符外任意一個字符,它和*組合可以匹配任意的字符或者字符串。
(5) [] 表示匹配"[]"內表示的范圍的任意一個字符、數字:
/[a-z]/ 可以匹配任意一個處于a和z之間的字母
(6) {} 表示它前面的字符可以出現的次數:
/a{m}/ 表示a可以出現m次
/a{m,n}/ 表示a至少出現m次,至多出現n次(n>m)
/a{m,}/ 表示a至少出現m次
*可以表示為{0,} +可以表示為{1,} ?可以表示為{0,1}
(7) ^ 在一個正則表達式開始的位置出現,表示字符串必須以這個正則表達式開始:
/^abc/ 匹配所有以abc開始的字符串
^出現在[]里面表示匹配[]表示的范圍之外的元素:
/[^a-z]/ 匹配在a到z范圍之外的所有字符
(8) $ 在一個正則表達式結束的位置出現,表示字符串必須以這個正則表達式結束:
/abc$/ 匹配所有以abc結束的字符串
(9) | 表示或的關系
(abc|abd) 匹配字符串abc或者abd
(10) ( ) 括號, 作用如下:
(i) 把單個的元素用括號括起來作為一個整體使用
(ii) 改變優先級:加上括號可以提高優先級。
(iii) 作為子模式使用 :
在下面所說的 preg_match 方法中,結果會被賦值到 $arr 變量中,先匹配外層模式,再匹配內層模式。
$pattern="/(\d{4}(\W)\d{2}\W\d{2})\s+(\d{2}(\W)\d{2}\W\d{2})\s+(?:am|pm)/"; //正則表達式模式
$string="today is 2010/09/15 15:35:28 pm..."; //需要和上面模式字符串進行匹配的變量字符串
if(preg_match($pattern, $string, $arr)){
print_r($arr);
}
結果
Array
(
[0] => 2010/09/15 15:35:28 pm
[1] => 2010/09/15
[2] => /
[3] => 15:35:28
[4] => :
)
當我們在一個正則表達式中需要重復用到一個子模式時,可以進行反向引用,直接在模式中把子模式提取出來然后再進行使用。\1 取第一個子模式、 \2取第二個子模式,但是注意是單引號還是雙引號引起來的正則表達式,因為在雙引號引起來的正則表達式中,它是可以解釋轉義字符的,所以 \1 必須要寫成 \1。 在單引號引起來的正則表達式中,則不會出現這種情況,\1 仍然可以寫成 \1:
$pattern1="/(\d{4}(\W)\d{2}\W\d{2})\s+(\d{2}(\W)\d{2}\W\d{2})\s+(?:am|pm)/"
$pattern2="/(\d{4}(\W)\d{2}\\1\d{2})\s+(\d{2}(\W)\d{2}\\2\d{2})\s+(?:am|pm)/"
上面的兩個正則表達式表示的是一個意思。(\W)作為第一個子模式被使用過了,所以就被存儲起來,\\1就表示它。同理\\2也可以這么理解
當我們不想把括號內的整體作為一個在匹配的時候作為一個子模式,可以在模式前面加上"?:"即可。上面的正則表達式中
(?:am|pm)
在匹配時并沒有作為子模式進行匹配。
元字符的優先級:
1)\ 轉義符最高
2)(),(?:) 括號其次
3)* + ? {}
4)^ $ \b
5)|
2.4 模式修正符
模式修正符就是幾個特殊字母,放在正則表達式的結尾。它的作用就是用來擴展正則表達式的功能,可以單獨使用也可以幾個放在一起使用。
常見的模式修正符:
i 表示在用模式進行匹配的時候不區分大小寫
m 表示把要匹配的目標字符串的每一行都當作一個整體的字符串來進行匹配,這個修正符主要是對元字符^和$產生影響。例如:
str = "abc
efg
23";
pattern = "/^efg/m"
使用上面的正則表達式來匹配str字符串就會匹配到efg。但是如果正則表達式的結尾不加上m就會匹配不到任何字符。
x 表示忽略正則表達式中的空格。例如:
pattern = "/a b c/";
str = "abc";
使用上面的正則表達式依然可以匹配到str。
e 正則表達式必須使用在 preg_replace 函數中使用
A 表示必須以正則表達式開頭,相當于加上^
Z 表示必須以正則表達式結尾,相當于加上$
U 表示取消貪婪模式(表示在成功匹配的前提下盡可能多的匹配)
參考文章鏈接:
http://cuiqingcai.com/1186.html
https://zh.wikipedia.org/wiki/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F
http://58582786.blog.51cto.com/1550000/1346431
聲明:本篇文章為作者在學習正則表達式時的總結,文章中的內容有來自互聯網的,并非自己100%原創。