如何在JS中使用正則表達式(可能是字母,數字和非alpha數字)找到3個字符的序列,'abb'有效,'abbb'無效, 。RegEx in JS找到3個相同的連續字符
此問題是我在此處詢問的一個問題的變體:How to combine these regex for javascript。
這是錯誤的:/(^([0-9a-zA-Z]|[^0-9a-zA-Z]))\1\1/
,那麼正確的做法是什麼?
如何在JS中使用正則表達式(可能是字母,數字和非alpha數字)找到3個字符的序列,'abb'有效,'abbb'無效, 。RegEx in JS找到3個相同的連續字符
此問題是我在此處詢問的一個問題的變體:How to combine these regex for javascript。
這是錯誤的:/(^([0-9a-zA-Z]|[^0-9a-zA-Z]))\1\1/
,那麼正確的做法是什麼?
這取決於你的實際含義。如果你只想匹配三個不相同的字符(即,如果abb
有效期爲你),你可以使用這個負前瞻:
(?!(.)\1\1).{3}
它首先斷言,當前位置沒有後跟三個次相同的字符。然後它匹配這三個字符。
如果你真的想匹配3個不同的字符(只有像abc
),它會變得更復雜一點。請使用這兩個負面預覽代替:
(.)(?!\1)(.)(?!\1|\2).
首先匹配一個字符。然後我們斷言,這不是跟着同一個字符。如果是這樣,我們匹配另一個字符。然後我們斷言這些既不是第一個也不是第二個字符。然後我們匹配第三個字符。
請注意,這些負面預覽((?!...)
)不會消耗任何字符。這就是爲什麼他們被稱爲lookaheads。他們只是檢查接下來會發生什麼(或者在這種情況下而不是接下來會發生什麼),然後正則表達式繼續從它離開的地方繼續。 Here是一個很好的教程。
還要注意,這個匹配任何東西,但換行符,或者真的如果你使用DOTALL或SINGLELINE選項什麼。由於您使用的是JavaScript,您可以通過在之後追加s
來激活該選項,正則表達式將關閉分隔符。如果(出於某種原因)您不想使用此選項,請將.
s替換爲[\s\S]
(它總是匹配任何字符)。
更新:
澄清的意見後,我意識到,你不想找到三不相同的字符,而是要斷言你的字符串中不含三個相同(和連續)的字符。
這比較容易一些,更接近您以前的問題,因爲它只需要一個負面預測。我們做的是這樣的:我們從頭開始搜索字符串,爲三個連續的相同字符。但是,因爲我們要聲明這不不存在,我們負先行把這個包:
^(?!.*(.)\1\1)
先行錨定到字符串的開始,所以這是唯一的地方,大家可以看看。向前看的圖案然後試圖從字符串中的任何位置找到三個相同的字符(因爲.*
;相同的字符與您在上一個問題中的相同方式匹配)。如果模式發現這些,負向前視將因此失敗,所以字符串將是無效的。如果不能找到三個相同的字符,則內部模式將永遠不匹配,因此負向預測將成功。
非常感謝你的回答。在我的情況下'abb'是有效的,而'abbb'不是。這個'(?!(。)\ 1 \ 1)。{3}'即使'abbb'也返回true – Nohsib
啊好的。我以爲你想在你的字符串中找到** 3個不相同的字符。但是你想斷言,你的字符串永遠不會有三個相同的字符。然後我會編輯我的答案。 –
@Nohsib看到更新,請 –
只是'(。)\ 1 \ 1'? – Prinzhorn
不,他想要的那個相反 –
@ m.buettner我看到了,錯過了「否」,我讀爲「Number」 – Prinzhorn