[英]RegEx in JS to find No 3 Identical consecutive characters
在使用正則表達式的JS中,如何找到3個字符的序列,“ abb”有效,而“ abbb”無效(可以是字母,數字和非字母數字)。
這個問題是我在這里提出的一個問題的變體: 如何將這些regex與javascript結合使用 。
這是錯誤的: /(^([0-9a-zA-Z]|[^0-9a-zA-Z]))\\1\\1/
,那么正確的方法是什么?
這取決於您的實際意思。 如果您只想匹配三個不相同的字符(也就是說,如果abb
對您有效),則可以使用以下否定前瞻:
(?!(.)\1\1).{3}
它首先斷言,當前位置后沒有三個相同字符。 然后匹配這三個字符。
如果您真的想匹配3個不同的字符(僅適用於abc
東西),它將變得更加復雜。 請改用這兩個否定的前瞻:
(.)(?!\1)(.)(?!\1|\2).
首先匹配一個字符。 然后我們斷言,這個字符后面沒有相同的字符。 如果是這樣,我們匹配另一個字符。 然后我們斷言,這些字符后面都沒有第一個字符或第二個字符。 然后我們匹配第三個字符。
請注意,這些否定的前行( (?!...)
)不會占用任何字符。 因此,它們被稱為前行。 他們只是檢查接下來要做什么(或在這種情況下,究竟是不是下一個即將到來),然后正則表達式從它離開的地方繼續。 這是一個很好的教程。
還要注意,這匹配除換行符以外的所有內容,如果使用DOTALL或SINGLELINE選項,則實際上匹配任何內容。 由於您使用的是JavaScript,因此只需在正則表達式關閉定界符后附加s
即可激活該選項。 如果(出於某種原因)您不想使用此選項,請替換.
s [\\s\\S]
(始終匹配任何字符)。
更新:
在注釋中澄清之后,我意識到您不想找到三個不同的字符,而是想斷言您的字符串不包含三個相同(和連續)的字符。
這稍微容易一些,並且更接近您以前的問題,因為它只需要一個否定的前瞻即可。 我們要做的是:我們從頭開始搜索三個連續的相同字符的字符串。 但是,由於我們要斷言它們不存在,因此將其包裝在否定的提前中:
^(?!.*(.)\1\1)
前瞻錨定在字符串的開頭,因此這是我們將要查找的唯一位置。 然后,前瞻中的模式嘗試從字符串的任何位置查找三個相同的字符(因為.*
;相同的字符以與上一個問題相同的方式進行匹配)。 如果模式找到了這些,則負前行將因此失敗,因此該字符串將無效。 如果找不到三個相同的字符,則內部模式將永遠不匹配,因此否定的超前查找將成功。
要查找非三個相同的字符,請使用正則表達式模式
([\s\S])(?!\1\1)[\s\S]{2}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.