1.概念:
一個(gè)正則表達(dá)式,就是用某種模式去匹配一類(lèi)字符串的一個(gè)公式。
2.Perl兼容正則表達(dá)式
必須記住的幾個(gè)符號(hào)和組合
. 匹配除換行符以外的所有字符一次
? 匹配 0 次或一次
* 匹配 0 次或多次
+ 匹配 1 次或多次
使用范例:
x? 匹配 0 次或一次 x 字符串
x* 匹配 0 次或多次 x 字符串,但匹配可能的最少次數(shù),*必須跟隨一個(gè)字符后面,不能單獨(dú)出現(xiàn)
x+ 匹配 1 次或多次 x 字符串,但匹配可能的最少次數(shù),+必須跟隨一個(gè)字符后面,不能單獨(dú)出現(xiàn)
.* 匹配 0 次或一次的任何字符
.+ 匹配 1 次或多次的任何字符
界定范圍和位置
^ 匹配字符開(kāi)頭的字符
$ 匹配字符結(jié)尾的字符
{m} 匹配剛好是 m 個(gè) 的指定字符串
{m,n} 匹配在 m個(gè) 以上 n個(gè) 以下 的指定字符串
{m,} 匹配 m個(gè) 以上 的指定字符串
[] 匹配符合 [] 內(nèi)的字符
[^] 匹配不符合 [] 內(nèi)的字符
[0-9] 匹配所有數(shù)字字符
[a-z] 匹配所有小寫(xiě)字母字符
[^0-9] 匹配所有非數(shù)字字符
[^a-z] 匹配所有非小寫(xiě)字母字符
\b 不屬于空白字符,向前縮進(jìn)一個(gè)字符
\d 匹配一個(gè)數(shù)字的字符,和 [0-9] 語(yǔ)法一樣
\w 英文字母或數(shù)字的字符,和 [a-zA-Z0-9]+ 語(yǔ)法一樣
\s 空格,和 [\n\t\r\f] 語(yǔ)法一樣
\B 匹配不以英文字母,數(shù)值為邊界的字符串
\D 非數(shù)字,其他同 \d
\S 非空格,和 [^\n\t\r\f] 語(yǔ)法一樣
\W 非英文字母或數(shù)字的字符串,和 [^a-zA-Z0-9] 語(yǔ)法一樣
a|b|c 匹配符合a字符 或是b字符 或是c字符 的字符串
abc 匹配含有 abc 的字符串
轉(zhuǎn)義: 使用\ 來(lái)取消元字符的特殊意義。包括 . * + \ [ ] { } ( ) ^ $
? 的多重定義-懶惰限定符
*? 重復(fù)任意次,但盡可能少重復(fù)
+? 重復(fù)1次或更多次,但盡可能少重復(fù)
?? 重復(fù)0次或1次,但盡可能少重復(fù)
{n,m}? 重復(fù)n到m次,但盡可能少重復(fù)
{n,}? 重復(fù)n次以上,但盡可能少重復(fù)
斷言匹配: 有4個(gè)
(?=exp) 零寬先行斷言,它匹配文本中的某些位置,這些位置的后面能匹配給定的后綴exp。
比如\w+(?=ing\b),匹配以ing結(jié)尾的單詞的前面部分(除了ing以外的部分),
zc:根據(jù)后綴匹配而已。和$區(qū)別在于$是行尾匹配。
如I'm singing while you're dancing. 它會(huì)匹配sing和danc。
(?<=exp) 零寬后行斷言,它匹配文本中的某些位置,這些位置的前面能給定的前綴匹配exp。
如(?<=\bre)\w+\b會(huì)匹配以re開(kāi)頭的單詞的后半部分(除了re以外的部分),
zc:匹配前綴。
例如在查找reading a book時(shí),它匹配ading。
(?!exp) 零寬負(fù)向先行斷言。會(huì)匹配后綴exp不存在的位置。
zc: 若不是exp或者沒(méi)有則匹配,用^在于存在一個(gè)不匹配某個(gè)exp的其他字符,
而!保證不匹配exp外可以不跟任何字符。
如:\d{3}(?!\d)匹配三位數(shù)字,而且這三位數(shù)字的后面不能是數(shù)字。
也可以是只有前3位數(shù)字。比較\d{3}(^\d)有區(qū)別.
(?<!exp) 零寬負(fù)向后行斷言。查找前綴exp不存在的位置.
常用語(yǔ)法:
1,正則里一些特殊字符
() 將表達(dá)式結(jié)組
[] 尋找一組字符
\d 等于 [0-9]
\D 等于 [^0-9]
\w 等于 [0-9A-Za-z_]
\W 等于 [^0-9A-Za-z_]
\s 等于 [\f\n\r\t ]
\S 等于 [^\f\n\r\t ]
. 等于 [^\n]
2,關(guān)于一些特殊符號(hào)
\b 不屬于空白字符,向前縮進(jìn)一個(gè)字符
\t 屬于空白字符,匹配制表符
\r 屬于空白字符,匹配回車(chē)符
\a 不屬于空白字符,匹配鬧鐘符
\e 不屬于空白字符,匹配轉(zhuǎn)義符
\033 不屬于空白字符,匹配八進(jìn)制符
\x1B 不屬于空白字符,匹配十六進(jìn)制符
\c[ 不屬于空白字符,匹配控制字符
屬于空白字符,匹配空格
屬于空白字符,匹配制表符
\f 屬于空白字符,匹配換頁(yè)符
\n 屬于空白字符,匹配換行符
\0 不屬于空白字符,功能不詳
\c 不屬于空白字符,功能不詳
\x 不屬于空白字符,功能不詳
3,注意正則里的選擇符的特殊性
選擇運(yùn)算符是所有運(yùn)算符中優(yōu)先級(jí)最低的,這意味著它最后執(zhí)行。
4,正則里的限定符的一些經(jīng)典用法
限定符常常與一些字符或詞聯(lián)合使用
* 匹配任意數(shù)個(gè);
+ 匹配一個(gè)或多個(gè);
? 匹配零個(gè)或一個(gè);
{n} 匹配 n 個(gè);
{n,m} 匹配 n 至 m 個(gè);
{n,} 匹配 n 和 n 個(gè)以上;
限定符貪婪好像與生俱有的。在缺省狀態(tài)下,*或+限定符匹配滿(mǎn)足正則表達(dá)式的一個(gè)范式的最大實(shí)例數(shù)。
可用?號(hào)顯式的規(guī)定限定符的不貪婪。如果問(wèn)號(hào)放在另一個(gè)限制符之后(甚至另一個(gè)問(wèn)號(hào)之后),都可以使限定符不貪婪。
5,聲明與斷言
首先注意聲明的長(zhǎng)度為 0;
Perl種有一組控制大小寫(xiě)和換碼的聲明:
\u 使下一個(gè)字母變大寫(xiě);
\l 使下一個(gè)字母變小寫(xiě);
\U 使文本的剩余字符變成大寫(xiě);
\L 使文本的剩余字符變成小寫(xiě);
\Q 會(huì)除字母之外的其他字符進(jìn)行換碼處理,直至遇到 \E 聲明、常規(guī)表達(dá)式結(jié)束或者字串結(jié)束。
\A聲明和脫字符號(hào)(^)匹配字串的開(kāi)始;
\Z聲明和美元符號(hào)($)匹配字串的結(jié)束或剛好在字串結(jié)束前的換行符;
\z 只匹配字串的結(jié)束;
\b 匹配一個(gè)單詞(字)邊界;
\B 匹配一個(gè)非單詞(字)邊界;
(?#text) 忽略括號(hào)內(nèi)的注釋文本;
(?:pattern) 與組一致,但匹配時(shí)不生成$1,$2;
(?imsx:pattern) 與組一致,但匹配時(shí)不生成$1,$2,在特定的風(fēng)格有效期間,內(nèi)嵌風(fēng)格匹配修飾符;
(?=pattern) 前看聲明,如果正則表達(dá)式在下一次匹配 pattern 風(fēng)格,就開(kāi)始匹配,而且不影響匹配效果。
如/\w+(?=\t)/將匹配制表符是否恰好在一個(gè)字\w+后面出現(xiàn),并且制表符不添加到$&的值中;
(?!pattern) 如果正則表達(dá)式在后面不匹配 pattern ,才會(huì)開(kāi)始匹配。如/foo(?!bar)/,只有當(dāng)出現(xiàn) foo,
并且后面不出現(xiàn) bar 時(shí)才開(kāi)始匹配;
(?<=pattern) 后看聲明,只有在pattern已經(jīng)匹配下面的表達(dá)式,并且不將 pattern 的結(jié)果放入$&變量中,
才匹配下面的語(yǔ)句。如/(?<=\t)\W+/匹配制表符是否恰好在\W+前出現(xiàn),但又不將制表符送到$& 中;
(? (?{code}) 表示對(duì) code 的使用是試驗(yàn)性的。如果返回真,就認(rèn)為是與(?:pattern)斷言同一行里的匹配。
code 不插入變量。這個(gè)斷言?xún)H僅在 use re 'eval' 編譯指示符時(shí)才有效;
(?>pattern) 如果類(lèi)型鎖定在當(dāng)前位置,就使用單獨(dú)的 pattern 匹配子字符串。如正則表達(dá)式/^(?>a*)ab/永遠(yuǎn)不會(huì)匹配,
因?yàn)檎Z(yǔ)句(?>a*)將匹配字符串開(kāi)頭所有的 a 字符,并刪除與 ab 匹配的字符 a;
(!<=pattern) 非后看聲明,與后看聲明意思相反;
(!=pattern) 非前看聲明,與前看聲明意思相反;
(?(condition)yes-pattern|no-pattern) 條件表達(dá)式——條件語(yǔ)句或者是一個(gè)圓括號(hào)中的整數(shù),或者是一個(gè)斷言;
(?(condition)yes-pattern)
(?imsx) 嵌入風(fēng)格匹配修飾符。當(dāng)要把表達(dá)式修改符嵌入在變量中,然后把變量用在不指定自己的修飾符的一般規(guī)則表達(dá)式中;
(?-imsx) 這個(gè)斷言很有用——后面帶任何內(nèi)容都會(huì)關(guān)閉修飾符,直到出現(xiàn)另一個(gè)嵌入的修飾符。