正則表示式應用“如何判斷字串中不包含連續重複的數字或者字母”?
技術標籤:JavaScriptWeb前端正則表示式字串正則表示式javascript正則regex
正則表示式是用來查詢、判斷、替換字串的一類工具。是很有意思的內容。很多程式語言都支援正則表示式,而且使用形式都大同小異。
今天來判斷的情況是字串中不包含連續重複的數字或者字母,比如:
aaaa,1111,abcccc111,qqqwww,qweeeeerty,等等。
1.前置知識:如何學習正則
這篇文章的內容需要有正則表示式的知識,如果沒學過正則表示式的同學,可以看一下這個教程,我覺得寫的很好:
《正則表示式30分鐘入門教程》
https://deerchao.cn/tutorials/regex/regex.htm
正則表示式用來測試也非常簡單,直接開啟瀏覽器的console介面,用Javascript測試即可:
用Javascript測試只需要掌握幾個函式的用法,看這個教程就可以。
https://www.runoob.com/js/js-regexp.html
下面,我們從零開始,一步一步實現我們的目標“判斷字串中不包含連續的數字或者字母”。
2.如何判斷字串中包含連續重複的數字或者字母?
首先是表示出任意一個數字或者字母:
[a-zA-Z0-9]
或者直接\w也可以。
然後用括號括起來,讓它成為一個分組:
([a-zA-Z0-9])
然後再把這個分組重複3次(加上原來的一共四次):
([a-zA-Z0-9])\1{3}
現在就可以檢測重複4次的數字或者字母了:
上面的正則中。\1表示第一個分組。但是之後正則表示式會越來越長,還會有巢狀的分組,到時候找到分組的序號可能比較困難,因此我們改為了命名分組:
(?<re1>[a-zA-Z0-9])\k<re1>{3}
現在,我們就實現了判斷字串中包含連續的數字或者字母這個功能了。
3.如何判斷字串中不包含連續重複的數字或者字母?
上面說了包含,那麼怎麼判斷不包含呢?
最簡單的方法當然是:
!(/(?<re1>[a-zA-Z0-9])\k<re1>{3}/.test('aacccaaa'))
首先用上一節的方法判斷包含,然後再取反就好了。
簡單的應用當然可以這樣做,但是如果這部分正則表示式是一個大的正則表示式的一部分呢?比如要給一個判斷密碼是否符合規範的正則表示式中新增”判斷不包含連續重複的數字或者字母”功能呢?這時候就沒辦法用取反了,畢竟正則表示式基本不支援邏輯運算。因此,我們還是用正則來實現這個功能。
實現這個功能,而且還不影響正則表示式其他部分的匹配,我們要用到負向零寬斷言。
首先來加一個負向零寬先行斷言:
(?!(?<re1>[a-zA-Z0-9])\k<re1>{3})
測試一下效果:
不管用了!不管有沒有重複的字元,都顯示true。
再試試負向零寬後行斷言:
(?<!(?<re1>[a-zA-Z0-9])\k<re1>{3})
經過測試也不行。
一個先行,一個後行,是不是需要組合起來?
(?!(?<re1>[a-zA-Z0-9])\k<re1>{3})(?<!(?<re2>[a-zA-Z0-9])\k<re2>{3})
(注意不同的分組名稱不一樣哦)
可以了?
從這個結果來看,看起來只能判斷字串開頭是重複的情況。
如果要任意位置都能判斷呢?加入標識任意位置符號“.*”就好了。
(?!.*(?<re1>[a-zA-Z0-9])\k<re1>{3})(?<!.*(?<re2>[a-zA-Z0-9])\k<re2>{3})
測試結果如下:
看來是正確的。
這樣就實現了,不管在任意的位置,前面和後面都不能出現連續重複至少4個的字母或者數字。
4.擴充套件,可繼續包含其他條件
在這個正則中我們還可以繼續包含其他的判斷條件,比如必須包含abc:
還可以把這個”必須包含abc”的條件寫成零寬斷言的形式,同學們可以自己試一試。