1. 程式人生 > 其它 >正則表示式應用“如何判斷字串中不包含連續重複的數字或者字母”?

正則表示式應用“如何判斷字串中不包含連續重複的數字或者字母”?

技術標籤: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”的條件寫成零寬斷言的形式,同學們可以自己試一試。