正則表達式(?=)正向先行斷言實戰(zhà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)文章
正則表達式實現(xiàn)手機號中間4位數(shù)隱藏或者只顯示末尾四位數(shù)
這篇文章主要介紹了正則表達式實現(xiàn)手機號中間4位數(shù)隱藏或者只顯示末尾四位數(shù)的相關(guān)知識,需要的朋友可以參考下2018-11-11在ASP中用正則表達式對象來校驗數(shù)據(jù)的合法性
我們在制作網(wǎng)站的時候,需要對用戶輸入的數(shù)據(jù)進行驗證,前端是輔助用戶方便填寫,后端才是真正的安全過濾,正則表達式對于一些數(shù)據(jù)校驗都是比較常見的不只asp中需要,php也需要,這里腳本之家小白就為大家簡單介紹一下2006-06-06javascript中使用正則表達式實現(xiàn)刪除字符串中的前后空格
在前臺應用進我們經(jīng)常會碰到要刪除用戶輸入的字符中的空格的問題,下面我們來介紹一下javascript中使用正則表達式實現(xiàn)刪除字符串中的空格方法2012-09-09使用正則表達式實現(xiàn)網(wǎng)頁爬蟲的思路詳解
網(wǎng)頁爬蟲:就是一個程序用于在互聯(lián)網(wǎng)中獲取指定規(guī)則的數(shù)據(jù)。這篇文章主要介紹了使用正則表達式實現(xiàn)網(wǎng)頁爬蟲的思路詳解,需要的朋友可以參考下2018-12-12淺談js正則字面量//與new RegExp的執(zhí)行效率
以前看到很多文章都說 字面量 會比 new 對象 形式效率高,但是在正則這里,好像不是這么回事,具體的請看下面的分析2020-04-04javascript用正則表達式把1234567890替換為abcdefghij
javascript用正則表達式把1234567890替換為abcdefghij...2007-06-06UNIX/LINUX SHELL 正則表達式語法詳解附使用方法
一個正則表達式就是由普通字符(例如字符 a 到 z)以及特殊字符(稱為元字符)組成的文字模式。該模式描述在查找文字主體時待匹配的一個或多個字符串。正則表達式作為一個模板,將某個字符模式與所搜索的字符串進行匹配2019-11-11