2016-10-05 23 views
-1

我想要匹配的字符串不能包含超過3個連續重複的同一個字符。所以:什麼是正則表達式匹配一個字符串不能包含超過x個連續字符

  • abaaaa [不匹配]​​
  • abawdasd [搭配]
  • abbbbasda [不匹配]​​
  • bbabbabba [搭配]

是的,這將是更容易和更整潔做一個包含連續字符的正則表達式匹配,然後在代碼之後否定它。但是,在這種情況下,這是不可能的。

我想打開問題到x個連續字符,以便它可以擴展到一般情況下使問題和答案更有用。

在這種情況下支持負向前瞻。

+0

我添加了這個問題,因爲我在網上找不到答案。我在其他SO問題的幫助下找出了答案。所以,我認爲這是一個很好的分享答案。 – Co7e

回答

0

要匹配不包含字符重複連續3次以上的字符串:

^((.)\2?(?!\2\2))+$

它是如何工作的:

^   Start of string 
(
    (.)  Match any character (not a new line) and store it for back reference. 
    \2?  Optionally match one more exact copies of that character. 
    (?!  Make sure the upcoming character(s) is/are not the same character. 
     \2\2 Repeat '\2' for as many times as you need 
    ) 
)+   Do ad nauseam 
$   End of string 

所以,/2在你的整個表達式的數量會你允許一個角色連續重複的次數,而且你不會得到一個匹配。

E.g.

  • ^((.)\2?(?!\2\2\2))+$將匹配所有連續不超過4次重複字符的字符串。

  • ^((.)\2?(?!\2\2\2\2))+$將匹配連續5次以上不重複一個字符的所有字符串。

請注意,此解決方案使用負向預測,但並非所有並非所有正則表達式都支持它。

1

使用負前瞻與反向引用:

^((.)(?!\2\2))*$ 

使用你的例子見live demo

(.)捕獲每個字符(第2組,因爲有一個初始包裹組1)和負先行斷言下一2個字符是所捕獲的字符的重複。

相關問題