欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

正則表達(dá)式(?=)正向先行斷言實(shí)戰(zhàn)案例

 更新時(shí)間:2022年11月17日 10:20:39   作者:AdamShyly  
x(?=y)稱為先行斷言(Positive look-ahead),x只有在y前面才匹配,y不會(huì)被計(jì)入返回結(jié)果,比如要匹配后面跟著百分號的數(shù)字,可以寫成/\d+(?=%)/,這篇文章主要給大家介紹了關(guān)于正則表達(dá)式(?=)正向先行斷言的相關(guān)資料,需要的朋友可以參考下

最近在練習(xí)正則表達(dá)式,遇到了一道很有意思的題,題目如下

我的答案如下

(?=.*?[A-Z])(?=.*?\d)(?=.*?[a-z]).{8,}

對于這個(gè)答案的理解得先從正向先行斷言的語法開始說起。

正向先行斷言的語法格式如下

expression1(?=expression2)
# 查找expression2前面的expression1

當(dāng)然這個(gè)expression1也可以不寫(也就是為空白符

例子如下

該正則表達(dá)式的意思為:尋找abcd字符串前的123456字符串。

這里也提一個(gè)有意思的地方

以上兩個(gè)正則表達(dá)式中的/\d+/gm/123456/gm其實(shí)都能匹配123456這個(gè)字符串,但在正向先行斷言中,前者會(huì)匹配每個(gè)數(shù)字前面的空白符,后者將123456字符串當(dāng)成一個(gè)整體,只匹配這個(gè)整體前面的空白符。

這里面的原理還需要等我研究一下,估計(jì)是跟底層代碼的實(shí)現(xiàn)有關(guān),我猜測是(?=\d+)在匹配的時(shí)候會(huì)將每個(gè)數(shù)字單獨(dú)提取出然后向前比較。

那么回到該題的答案中,先讓我們看看 (?=.*?[A-z]) 是什么意思。

很明顯上圖匹配了大寫字母A前面的所有空白符

其中的.*?[A-Z]代表大寫字母及其前面的字符串且為懶惰匹配

那么(?=.*?[A-Z])(?=.*?\d)的意思就有點(diǎn)套娃了,按我的理解就是對于(?=.*?\d)而言把(?=.*?[A-Z])當(dāng)成expression1,對于(?=.*?[A-Z])而言就是把空白符當(dāng)成expression1

那么這個(gè)正則表達(dá)式就表示為:在尋找到每個(gè)大寫字母前面的所有空白符的基礎(chǔ)上還要滿足:這些空白符都在每個(gè)數(shù)字前面的所有空白符這個(gè)匹配集合中。相當(dāng)于是兩個(gè)空白符集合的交集。

所以(?=.*?[A-Z])(?=.*?\d)(?=.*?[a-z])相當(dāng)于是每個(gè)大寫字母、小寫字母、數(shù)字前面的所有空白字符的交集。

 而后面的.{8,}則匹配這些空白字符后面至少八位字符(貪婪匹配)。

附:先行否定斷言

x(?!y)稱為先行否定斷言(Negative look-ahead),x只有不在y前面才匹配,y不會(huì)被計(jì)入返回結(jié)果。比如,要匹配后面跟的不是百

分號的數(shù)字,就要寫成/\d+(?!%)/。

/\d+(?!\.)/.exec('3.14') // ["14"]
// ["14"]

上面代碼中,正則表達(dá)式指定,只有不在小數(shù)點(diǎn)前面的數(shù)字才會(huì)被匹配,因此返回的結(jié)果就是14。

“先行否定斷言”中,括號里的部分是不會(huì)返回的。

var m = 'abd'.match(/b(?!c)/);
m // ['b']

上面的代碼使用了先行否定斷言,b不在c前面所以被匹配,而且括號對應(yīng)的d不會(huì)被返回。

總結(jié)

到此這篇關(guān)于正則表達(dá)式(?=)正向先行斷言的文章就介紹到這了,更多相關(guān)正則表達(dá)式正向先行斷言內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論