我們考慮一個(gè)很特殊的情況, 當(dāng)我們要匹配四個(gè)IP段相同的情況, 如 100.100.100.100 時(shí), 重復(fù)匹配分組的策略失效了: 重復(fù)匹配分組 并不能保證匹配相同的數(shù)字 -> 這時(shí)候我們需要借助 后向引用
策略的力量了(少年, 你渴望力量嗎2333, 戳我頭像, 帶你探索音樂(lè)與代碼交織的文藝道路.)
后向引用在不同語(yǔ)言的正則表達(dá)式書(shū)寫(xiě)中, 有不同的語(yǔ)法, 我們討論JS中最常見(jiàn)的一種, 形如: \number
的后向引用, 其中, number
代表分組的序號(hào).
給你一個(gè)簡(jiǎn)單的栗子, 瞬間就記住了, 假使我們要匹配重復(fù)的三位數(shù)字, 我們將匹配一個(gè)數(shù)字的規(guī)則標(biāo)記為一個(gè)分組: (\d)
, 重復(fù)匹配這個(gè)分組(第一個(gè)分組)的具體內(nèi)容
三次: (\d)\1
, 這樣就達(dá)到了目的.
我們很容易將重復(fù)匹配和后向引用分別開(kāi)來(lái): 前者是重復(fù)匹配相同的規(guī)則, 后者是匹配分組的具體內(nèi)容.
默認(rèn)的一些規(guī)則需要稍加理解并記住:
\0
代表的是, 整個(gè)正則表達(dá)式的匹配的內(nèi)容
還記得我看過(guò)的一篇大概名為<30分鐘學(xué)會(huì)正則表達(dá)式>的文章中, 里面提及過(guò)正則斷言.
當(dāng)時(shí)感覺(jué)真是一看就懂. 但很遺憾, 實(shí)際生產(chǎn)中, 使用各種復(fù)雜正則表達(dá)式的情況實(shí)在是太少, 今天如果不翻閱百度, 我恐怕是不能記起斷言的分類和各種使用方法了.
斷言的字面意思便是, 斷定(程序)運(yùn)行到此時(shí)(結(jié)果)是這樣的"場(chǎng)景", 它描述的是一種 場(chǎng)景
, 換句話說(shuō), 是一種"肯定的場(chǎng)景". 但要記住的是, 我們的"結(jié)果"是不包含在"場(chǎng)景"里面的.
VueJS里頭需要匹配HTML tag, 我們就以匹配: '<segment>Not Fault</segment>' 中的 'Not Fault' 為例吧.
我們?nèi)绻褂闷胀ǖ恼齽t表達(dá)式, 如 /<segment>.*</segment>/
會(huì)匹配到整個(gè)字符串 '<segment>Not Fault</segment>'. 我們使用斷言, 以"場(chǎng)景"的方式思考: '<segment>' 和 '</segment>' 是一種"肯定的場(chǎng)景", 我們需要匹配的結(jié)果是: 'Not Fault', 無(wú)論tag內(nèi)部的字符無(wú)論如何變化, tag頭和tag尾都是不變的.
一鼓作氣, 我們繼續(xù)往下
先行斷言, 我是這樣理解的: 先匹配內(nèi)容, 再做"場(chǎng)景"假設(shè).
放到我們先前的栗子中, 便這樣匹配, 一直匹配內(nèi)容, 直到碰上 '</segment>' 的場(chǎng)景, 語(yǔ)法如下: (?=</segment>)
后發(fā)斷言, 我的理解是: 先匹配場(chǎng)景, 再匹配內(nèi)容.
放到我們先前的栗子中, 先匹配 '<segment>' 的場(chǎng)景, 再繼續(xù)往下匹配內(nèi)容, 語(yǔ)法如下: (?<=<segment>)
正則表達(dá)式是對(duì)字符串內(nèi)容做匹配, 所以我將"先"和"后"的理解綁定到內(nèi)容匹配的先后順序上, 方便理解.
我們將先行斷言和后發(fā)斷言結(jié)合起來(lái), 整個(gè)表達(dá)式如下: (?<=<segment>).*(?=</segment>)
, 我們便可獲得想要的結(jié)果: 'Not Fault' 了.
其實(shí)我們剛才做的是肯定的場(chǎng)景, 實(shí)際情況中還有"不滿足此場(chǎng)景"的使用場(chǎng)景.
比如, 我們剛才使用的表達(dá)式: (?<=<segment>).*(?=</segment>)
是肯定有 '<segment>' '</segment>' 的場(chǎng)景下去匹配內(nèi)容, 其實(shí)是使用的 "正后發(fā)斷言" 和 "正先行斷言", "正"即代表肯定的狀態(tài).
那負(fù)斷言, 也就是不滿足場(chǎng)景的斷言咯... 語(yǔ)法即把正斷言中的等于號(hào)換成感嘆號(hào):
負(fù)先行斷言 (?!)
負(fù)后發(fā)斷言 (?<!)
如: ['1999','2099','2199'...'9099'] 中如果我們要匹配除了'1999'以外的所有帶有'99'結(jié)尾的年份, 我們可以使用表達(dá)式: (?<!19)99
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com