轉(zhuǎn)載請(qǐng)注明出處:http://www.reibang.com/p/ebba0458d889
本文出自 容華謝后的博客
往期回顧:
《一起學(xué)習(xí)正則表達(dá)式(一)那些讓人頭暈的元字符》
《一起學(xué)習(xí)正則表達(dá)式(二)量詞與貪婪》
《一起學(xué)習(xí)正則表達(dá)式(三)分組與引用》
《一起學(xué)習(xí)正則表達(dá)式(四)常見(jiàn)的4種匹配模式》
《一起學(xué)習(xí)正則表達(dá)式(五)斷言匹配》
《一起學(xué)習(xí)正則表達(dá)式(六)正則匹配原理》
0.寫(xiě)在前面
一提到斷言捌蚊,很多人第一時(shí)間就會(huì)想到單元測(cè)試,在正則中近弟,斷言是指對(duì)匹配到的文本位置有要求缅糟,比如我們想要查找一段文本中 tom 這個(gè)單詞,但是其他單詞 tomorrow 或者 tomato 也包含 tom祷愉,我們?cè)撛趺慈ハ薅卮盎拢@就是斷言大顯身手的時(shí)候了。
對(duì)匹配到的文本位置有要求二鳄,其實(shí)就是限定單詞左邊和右邊的字符類型赴涵,細(xì)想下來(lái),其實(shí)和單元測(cè)試中的斷言也差不多订讼,正則中常見(jiàn)的斷言有三種句占,分別是單詞邊界、行的開(kāi)始和結(jié)束躯嫉、環(huán)視,一起來(lái)看下杨拐。
1.單詞邊界
我們?cè)诘谌恼轮衅聿停瑢W(xué)習(xí)了正則中分組與引用的知識(shí),其中在查找那一節(jié)哄陶,我們舉了一個(gè)例子帆阳,來(lái)回顧下:
有這樣一個(gè)需求,在一個(gè)目標(biāo)字符串中,查找兩個(gè)重復(fù)出現(xiàn)的單詞蜒谤,還沒(méi)有學(xué)到單詞邊界山宾,我們先用 \w{2,} 來(lái)表示出現(xiàn)的單詞,重復(fù)的單詞就是 (\w{2,} \1)鳍徽,看下結(jié)果:
有的同學(xué)會(huì)有疑問(wèn)资锰,為什么要用 \w{2,} 來(lái)表示一個(gè)單詞呢,\w+ 不行嗎阶祭,來(lái)看下 \w+ 匹配的效果:
可以看到字母 s 也被匹配到了绷杜,這并不是我們想要的結(jié)果,我們需要優(yōu)雅的解決這個(gè)問(wèn)題濒募,就用到了單詞邊界鞭盟,邊界的英文是 Boundary,取其首字母小寫(xiě)瑰剃,就用 \b 來(lái)表示齿诉,可以寫(xiě)在單詞的左邊或右邊,修改之后是這樣的:
\b 放在單詞的左邊或者右邊晌姚,匹配結(jié)果是不一樣的:
單詞 | tom 單詞包含 tom |
\btom 以 tom 開(kāi)頭的單詞 |
tom\b 以 tom 結(jié)尾的單詞 |
\btom\b 只能是 tom |
---|---|---|---|---|
tom | ? | ? | ? | ? |
tomorrow | ? | ? | ? | ? |
atom | ? | ? | ? | ? |
atomic | ? | ? | ? | ? |
2.行的開(kāi)始和結(jié)束
在前幾篇文章中粤剧,我們已經(jīng)對(duì)行的開(kāi)始和結(jié)束標(biāo)記有一些了解了,在正則中舀凛,我們使用脫字符 ^ 來(lái)表示行的開(kāi)始俊扳,美元符 $ 來(lái)表示行的結(jié)尾,舉個(gè)栗子:
對(duì)登錄密碼進(jìn)行格式校驗(yàn)猛遍,密碼要求是6位連續(xù)的數(shù)字馋记,我們可以很快的寫(xiě)出正則表達(dá)式 \d{6},來(lái)驗(yàn)證下:
可以看到6位數(shù)字可以匹配成功懊烤,7位梯醒、8位也可以匹配成功,這顯然是不對(duì)的腌紧,修改下:
和單詞邊界差不多,^ 限定以什么開(kāi)始壁肋,$ 限定以什么結(jié)尾号胚,只不過(guò)限定的不是單詞,而是一段文本浸遗。
我們還可以使用 \A 和 \z(Python 中使用 \Z) 來(lái)限定行的開(kāi)始和結(jié)束:
注意:\A \Z 這種匹配方式是不支持多行模式的,目標(biāo)字符串中也不可以有其他字符跛锌,比如換行或者空格弃秆。
3.環(huán)視
環(huán)視在正則中的意思就是左右看,也被稱為零寬斷言,和單詞邊界類似菠赚,但是更加靈活了脑豹,環(huán)視可以限定單詞的左邊可以是什么類型,不可以是什么類型衡查,單詞的右邊可以是什么類型瘩欺,不可以是什么類型:
正則 | 名稱 | 含義 | 示例 |
---|---|---|---|
(?<=Y) | 肯定逆序環(huán)視 | 左邊是Y | (?<=\d)th 左邊是數(shù)字的 th,可以匹配上 9th |
(?<!Y) | 否定逆序環(huán)視 | 左邊不是Y | (?<!\d)th 左邊不是數(shù)字的 th峡捡,可以匹配上 health |
(?=Y) | 肯定順序環(huán)視 | 右邊是Y | six(?=\d) 右邊是數(shù)字的 six击碗,可以匹配上 six6 |
(?!Y) | 否定順序環(huán)視 | 右邊不是Y | six(?!\d) 右邊不是數(shù)字的 six,可以匹配上 sixgod |
環(huán)視的正則表達(dá)式是用括號(hào)括起來(lái)的们拙,注意這個(gè)括號(hào)不會(huì)被保存成子組稍途,引用數(shù)括號(hào)位置的時(shí)候注意跳過(guò)。
這四個(gè)表達(dá)式砚婆,乍一看起來(lái)有點(diǎn)懵械拍,其實(shí)是有規(guī)律可循的,帶尖括號(hào)的看左邊装盯,不帶尖括號(hào)的看右邊坷虑,帶嘆號(hào)就是否定,這樣就好記了埂奈。
我們用環(huán)視來(lái)表示下上面學(xué)到的單詞邊界迄损,可以這樣寫(xiě) ((?<!\w)\w+(?!\w)):
4.寫(xiě)在最后
最后在總結(jié)下上面講到的內(nèi)容:
到這里,正則表達(dá)式的斷言匹配就講完了账磺,如果有問(wèn)題可以給我留言評(píng)論芹敌,謝謝。
正則表達(dá)式在線校驗(yàn)工具:https://regex101.com/