一起學(xué)習(xí)正則表達(dá)式(五)斷言匹配

思維導(dǎo)圖

轉(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+ 匹配的效果:

分組查找 \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)證下:

密碼校驗(yàn)

可以看到6位數(shù)字可以匹配成功懊烤,7位梯醒、8位也可以匹配成功,這顯然是不對(duì)的腌紧,修改下:

密碼校驗(yàn)茸习,開(kāi)始結(jié)束限定

和單詞邊界差不多,^ 限定以什么開(kāi)始壁肋,$ 限定以什么結(jié)尾号胚,只不過(guò)限定的不是單詞,而是一段文本浸遗。

我們還可以使用 \A\z(Python 中使用 \Z) 來(lái)限定行的開(kāi)始和結(jié)束:

密碼校驗(yàn)猫胁,\A \Z 限定

注意:\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))

環(huán)視

4.寫(xiě)在最后

最后在總結(jié)下上面講到的內(nèi)容:

思維導(dǎo)圖

到這里,正則表達(dá)式的斷言匹配就講完了账磺,如果有問(wèn)題可以給我留言評(píng)論芹敌,謝謝。

正則表達(dá)式在線校驗(yàn)工具:https://regex101.com/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末垮抗,一起剝皮案震驚了整個(gè)濱河市氏捞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冒版,老刑警劉巖液茎,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異辞嗡,居然都是意外死亡捆等,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)续室,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)栋烤,“玉大人,你說(shuō)我怎么就攤上這事猎贴。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵她渴,是天一觀的道長(zhǎng)达址。 經(jīng)常有香客問(wèn)我,道長(zhǎng)趁耗,這世上最難降的妖魔是什么沉唠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮苛败,結(jié)果婚禮上满葛,老公的妹妹穿的比我還像新娘。我一直安慰自己罢屈,他們只是感情好嘀韧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著缠捌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上炊苫,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天衙猪,我揣著相機(jī)與錄音,去河邊找鬼哑芹。 笑死炎辨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的聪姿。 我是一名探鬼主播碴萧,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼咳燕!你這毒婦竟也來(lái)了勿决?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤招盲,失蹤者是張志新(化名)和其女友劉穎低缩,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體曹货,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咆繁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了顶籽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玩般。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖礼饱,靈堂內(nèi)的尸體忽然破棺而出坏为,到底是詐尸還是另有隱情究驴,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布匀伏,位于F島的核電站洒忧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏够颠。R本人自食惡果不足惜熙侍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望履磨。 院中可真熱鬧蛉抓,春花似錦、人聲如沸剃诅。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)综苔。三九已至惩系,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間如筛,已是汗流浹背堡牡。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留杨刨,地道東北人晤柄。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像妖胀,于是被迫代替她去往敵國(guó)和親芥颈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容