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

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

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

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

我的答案如下

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

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

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

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

當然這個expression1也可以不寫(也就是為空白符

例子如下

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

這里也提一個有意思的地方

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

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

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

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

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

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

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

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

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

附:先行否定斷言

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

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

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

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

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

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

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

總結(jié)

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

相關(guān)文章

最新評論