正則表達(dá)式描述了一種字符串歐匹配模式沐扳,通過這個(gè)模式在特定的函數(shù)中對(duì)字符串進(jìn)行匹配,查找织鲸,替換舔腾,分割等操作。
四部分組成
- 原子
- 元字符
- 定界符
- 模式修正符
定界符:
正則表達(dá)式通常都需要將模式表達(dá)式放入定界符之間搂擦。作為定界的字符稳诚,可以是除了字母,數(shù)字瀑踢,反斜線“\” 以外的任何字符扳还,通常使用“/”作為定界符才避,不過建議使用“#”。(不要問我什么氨距。桑逝。。)
原子:
正則表達(dá)式最基本的組成單位俏让,一個(gè)正則表達(dá)式中最少要有一個(gè)原子楞遏。可以將其詳細(xì)劃分為5類首昔。
1.普通字符作為原子
大小寫字母或者數(shù)字寡喝,如 0-9、az勒奇、AZ
2.一些特殊字符和元字符
任何一個(gè)符號(hào)都可以作為原子使用预鬓,比如!赊颠,@格二,等等。竣蹦。但是如這個(gè)符號(hào)在正則表達(dá)式中有特殊意義我們應(yīng)該使用“\”進(jìn)行轉(zhuǎn)義顶猜,像引號(hào),加號(hào)草添,星號(hào)等驶兜。應(yīng)該轉(zhuǎn)義為 " , ' , * , +
3.非打印字符
所謂非打印字符,是一些在字符串中的格式控制符號(hào)远寸,例如空格抄淑,回車,制表符等
4.使用“通用字符類型”作為原子
有時(shí)我們需要一個(gè)原子匹配一類字符
\d 等價(jià)于[0-9]
\D 和樓上相反
\s 匹配任意一個(gè)空白字符驰后,等價(jià)于[\f\n\r\t\v]
\S 和樓上相反
\w 匹配任意一個(gè)數(shù)字肆资,字母,下劃線灶芝,等價(jià)于[0-9a-zA-Z_]
\W 和樓上相反
. 匹配除了任意一個(gè)字符郑原,默認(rèn)情況下不包括換行符相當(dāng)于[^\n]
5.自定義原子表([])作為原子
使用原子表“[]”可以定義一組地位平等的原子,
且只能從中選擇一個(gè)原子進(jìn)行匹配
例如:
/[ajd]sp/ --可以匹配asp夜涕,jsp犯犁,dsp三個(gè)里面的任意一個(gè).
/[^ajd]sp/ --可以匹配除了 asp,jsp女器,dsp三種以外的任何字符串酸役,如xsp,nsp
元字符:
元字符不能單獨(dú)出現(xiàn),它必須用來修飾原子涣澡。
有以下幾種類型的元字符:
1.限定符
限定原子出現(xiàn)多少次才能滿足匹配贱呐。有六種限定符
“*”、表示任意次數(shù)
“+”入桂、表示一次或多次
“奄薇?”、表示0次或者1次
“{n}”抗愁、自定義n次
“{n,}”馁蒂、自定義n次以上
“{n,m}”、自定義n次到m次
2.邊界限制
限制字符串或者單詞的邊界范圍獲得更準(zhǔn)確的匹配結(jié)果
“^” 指字符串的開始
“$”指字符串的結(jié)束
“\b”描述字符串中的每個(gè)單詞的前或后邊界
“\B”表示非單詞邊界
3.模式選擇符(|)
“|”用來分割多選一的情況驹愚,優(yōu)先級(jí)最低
4.模式單元
模式單元是使用元字符“()”將多個(gè)原子組合成一個(gè)大原子远搪,當(dāng)成一個(gè)單元獨(dú)立使用
5.后向引用
使用元字符“()”標(biāo)記的開始和結(jié)束多個(gè)原子劣纲,不僅是一個(gè)獨(dú)立的單元逢捺,也是一個(gè)子表達(dá)式。這樣癞季,對(duì)一個(gè)正則表達(dá)式模式或部分模式兩邊添加圓括號(hào)將導(dǎo)致相關(guān)匹配儲(chǔ)存到一個(gè)臨時(shí)緩沖區(qū)劫瞳,可以被獲取以后使用。所捕獲的每個(gè)子匹配都按照正則表達(dá)式模式中從左至右所遇到的內(nèi)容儲(chǔ)存绷柒。儲(chǔ)存子匹配的緩沖區(qū)編號(hào)從1開始至99志于。每個(gè)緩沖區(qū)可以使用'\1'、‘\2’废睦、‘\3’這樣的形式進(jìn)行引用伺绽,當(dāng)然了,需要在前面加上一個(gè)反斜線轉(zhuǎn)義嗜湃,變成這樣‘\1’奈应、‘\2’、‘\3’购披。
舉個(gè)栗子:
'/^\d{4}\W\d{2}\W\d{2}/' --這是一個(gè)匹配日期的格式杖挣,如2008-08/08 或2008/08-08
'/^\d{4}(\W)\d{2}\\1\d{2}/' --這是一個(gè)匹配日期的格式,如2008-08-08 或2008-08-08
在第一個(gè)例子中我們可以發(fā)現(xiàn)兩個(gè)“\W”可以匹配任意特殊字符刚陡,兩者完全可以不是同一個(gè)特殊字符惩妇,
但在實(shí)際中我們要求日期間的特殊字符應(yīng)該一致,比如都是“-”或者都是“/”筐乳。
而第二個(gè)例子達(dá)到了這種效果歌殃,這是因?yàn)槟J健癨W”加上了元字符“()”,結(jié)果已經(jīng)被儲(chǔ)存在了緩沖區(qū),所以在第一個(gè)“\W”的位置使用“-”蝙云,則下一個(gè)位置使用“\1”引用時(shí)氓皱,匹配模式也必須是字符串“-”。
當(dāng)需要使用模式單元而又不想儲(chǔ)存匹配結(jié)果時(shí)贮懈,可以使用非捕獲元字符“匀泊?:”优训、“?=” 或 “各聘?揣非!”忽略對(duì)相關(guān)匹配的保存。在一些正則表達(dá)式中躲因,使用非儲(chǔ)存模式單元是必要的早敬,可以改變后向引用的順序。如下所示:
'/(windows)(linux)\\2OS/' --使用“\2”再次引用第二個(gè)緩沖區(qū)中的字符串“l(fā)inux”
'/(?:windows)(linux)\\1OS/' --使用“大脉?:” 忽略了第一個(gè)子表達(dá)式的儲(chǔ)存搞监,所以“\1”所引用的就是“l(fā)inux”
》模式匹配的優(yōu)先級(jí)
使用正則表達(dá)式時(shí),需要注意匹配的順序镰矿,通常是優(yōu)先級(jí)從左到右進(jìn)行運(yùn)算琐驴,不同的優(yōu)先級(jí)的運(yùn)算先高后低。
如下表:
順序 | 元字符 | 描述 |
---|---|---|
1 | \ | 轉(zhuǎn)義符號(hào) |
2 | ()秤标、(?:)绝淡、(?=)、[] | 模式單元和原子表 |
3 | *苍姜、+牢酵、?衙猪、{n}馍乙、{n,}、{n,m} | 重復(fù)匹配 |
4 | ^垫释、$丝格、\b、\B饶号、\A 铁追、\Z | 邊界限制 |
5 | I | 模式選擇 |
模式修正符:
模式修正符在正則表達(dá)式定界符之外使用(最后一個(gè)斜線 ""之后)模式修正符可以調(diào)整正則表達(dá)式的解釋,擴(kuò)展了正則表達(dá)式在匹配茫船、替換等操作時(shí)的某些功能琅束,而且修正符可以組合使用,下列表格中算谈,列出了一些常用的模式修正符及其功能涩禀。
模式修正符 | 功能描述 |
---|---|
i | 匹配時(shí)不區(qū)分大小寫 |
m | 將字符串視為多行 |
s | 設(shè)定了此修正符 '.'將匹配所有的字符,包括換行符 |
x | 模式中的空白忽略不計(jì)然眼,除非它已被轉(zhuǎn)義 |
e | 只用在preg_replace()函數(shù)中艾船,在替換字符串中對(duì)逆向引用做正常替換,將其作為php代碼求職,并用其結(jié)果換來替換所搜索的字符串 |
U | 本修正符反轉(zhuǎn)了匹配數(shù)量的值屿岂,使其不是默認(rèn)的重復(fù)践宴,而變成在后面跟上“?” 才變得重復(fù) |
D | 模式中的美元字符僅匹配目標(biāo)字符串的結(jié)尾爷怀。沒有此選項(xiàng)時(shí)阻肩,如果最后一個(gè)字符是換行符的話,美元符號(hào)也會(huì)匹配此字符之前运授。如果設(shè)定了m修正符忽略此選項(xiàng) |