正則表達式描述了一種字符串歐匹配模式,通過這個模式在特定的函數中對字符串進行匹配,查找,替換,分割等操作。
四部分組成
- 原子
- 元字符
- 定界符
- 模式修正符
定界符:
正則表達式通常都需要將模式表達式放入定界符之間。作為定界的字符,可以是除了字母,數字,反斜線“\” 以外的任何字符,通常使用“/”作為定界符,不過建議使用“#”。(不要問我什么。。。)
原子:
正則表達式最基本的組成單位,一個正則表達式中最少要有一個原子。可以將其詳細劃分為5類。
1.普通字符作為原子
大小寫字母或者數字,如 0-9、az、AZ
2.一些特殊字符和元字符
任何一個符號都可以作為原子使用,比如!,@,等等。。但是如這個符號在正則表達式中有特殊意義我們應該使用“\”進行轉義,像引號,加號,星號等。應該轉義為 " , ' , * , +
3.非打印字符
所謂非打印字符,是一些在字符串中的格式控制符號,例如空格,回車,制表符等
4.使用“通用字符類型”作為原子
有時我們需要一個原子匹配一類字符
\d 等價于[0-9]
\D 和樓上相反
\s 匹配任意一個空白字符,等價于[\f\n\r\t\v]
\S 和樓上相反
\w 匹配任意一個數字,字母,下劃線,等價于[0-9a-zA-Z_]
\W 和樓上相反
. 匹配除了任意一個字符,默認情況下不包括換行符相當于[^\n]
5.自定義原子表([])作為原子
使用原子表“[]”可以定義一組地位平等的原子,
且只能從中選擇一個原子進行匹配
例如:
/[ajd]sp/ --可以匹配asp,jsp,dsp三個里面的任意一個.
/[^ajd]sp/ --可以匹配除了 asp,jsp,dsp三種以外的任何字符串,如xsp,nsp
元字符:
元字符不能單獨出現,它必須用來修飾原子。
有以下幾種類型的元字符:
1.限定符
限定原子出現多少次才能滿足匹配。有六種限定符
“*”、表示任意次數
“+”、表示一次或多次
“?”、表示0次或者1次
“{n}”、自定義n次
“{n,}”、自定義n次以上
“{n,m}”、自定義n次到m次
2.邊界限制
限制字符串或者單詞的邊界范圍獲得更準確的匹配結果
“^” 指字符串的開始
“$”指字符串的結束
“\b”描述字符串中的每個單詞的前或后邊界
“\B”表示非單詞邊界
3.模式選擇符(|)
“|”用來分割多選一的情況,優先級最低
4.模式單元
模式單元是使用元字符“()”將多個原子組合成一個大原子,當成一個單元獨立使用
5.后向引用
使用元字符“()”標記的開始和結束多個原子,不僅是一個獨立的單元,也是一個子表達式。這樣,對一個正則表達式模式或部分模式兩邊添加圓括號將導致相關匹配儲存到一個臨時緩沖區,可以被獲取以后使用。所捕獲的每個子匹配都按照正則表達式模式中從左至右所遇到的內容儲存。儲存子匹配的緩沖區編號從1開始至99。每個緩沖區可以使用'\1'、‘\2’、‘\3’這樣的形式進行引用,當然了,需要在前面加上一個反斜線轉義,變成這樣‘\1’、‘\2’、‘\3’。
舉個栗子:
'/^\d{4}\W\d{2}\W\d{2}/' --這是一個匹配日期的格式,如2008-08/08 或2008/08-08
'/^\d{4}(\W)\d{2}\\1\d{2}/' --這是一個匹配日期的格式,如2008-08-08 或2008-08-08
在第一個例子中我們可以發現兩個“\W”可以匹配任意特殊字符,兩者完全可以不是同一個特殊字符,
但在實際中我們要求日期間的特殊字符應該一致,比如都是“-”或者都是“/”。
而第二個例子達到了這種效果,這是因為模式“\W”加上了元字符“()”,結果已經被儲存在了緩沖區,所以在第一個“\W”的位置使用“-”,則下一個位置使用“\1”引用時,匹配模式也必須是字符串“-”。
當需要使用模式單元而又不想儲存匹配結果時,可以使用非捕獲元字符“?:”、“?=” 或 “?!”忽略對相關匹配的保存。在一些正則表達式中,使用非儲存模式單元是必要的,可以改變后向引用的順序。如下所示:
'/(windows)(linux)\\2OS/' --使用“\2”再次引用第二個緩沖區中的字符串“linux”
'/(?:windows)(linux)\\1OS/' --使用“?:” 忽略了第一個子表達式的儲存,所以“\1”所引用的就是“linux”
》模式匹配的優先級
使用正則表達式時,需要注意匹配的順序,通常是優先級從左到右進行運算,不同的優先級的運算先高后低。
如下表:
順序 | 元字符 | 描述 |
---|---|---|
1 | \ | 轉義符號 |
2 | ()、(?:)、(?=)、[] | 模式單元和原子表 |
3 | *、+、?、{n}、{n,}、{n,m} | 重復匹配 |
4 | ^、$、\b、\B、\A 、\Z | 邊界限制 |
5 | I | 模式選擇 |
模式修正符:
模式修正符在正則表達式定界符之外使用(最后一個斜線 ""之后)模式修正符可以調整正則表達式的解釋,擴展了正則表達式在匹配、替換等操作時的某些功能,而且修正符可以組合使用,下列表格中,列出了一些常用的模式修正符及其功能。
模式修正符 | 功能描述 |
---|---|
i | 匹配時不區分大小寫 |
m | 將字符串視為多行 |
s | 設定了此修正符 '.'將匹配所有的字符,包括換行符 |
x | 模式中的空白忽略不計,除非它已被轉義 |
e | 只用在preg_replace()函數中,在替換字符串中對逆向引用做正常替換,將其作為php代碼求職,并用其結果換來替換所搜索的字符串 |
U | 本修正符反轉了匹配數量的值,使其不是默認的重復,而變成在后面跟上“?” 才變得重復 |
D | 模式中的美元字符僅匹配目標字符串的結尾。沒有此選項時,如果最后一個字符是換行符的話,美元符號也會匹配此字符之前。如果設定了m修正符忽略此選項 |