匹配不包含多于x个连续字符的字符串的正则表达式是什么

时间:2016-10-05 17:01:51

标签: regex regex-negation

我希望匹配连续重复的不超过3个相同字符的字符串。所以:

  • abaaaa [no match]
  • abawdasd [match]
  • abbbbasda [no match]
  • bbabbabba [match]

是的,进行包含连续字符的正则表达式匹配会更容易和更简洁,然后在代码中否定它。但是,在这种情况下,这是不可能的。

我想向x个连续字符打开这个问题,以便可以扩展到一般情况,使问题和答案更有用。

在这种情况下支持负向前瞻。

3 个答案:

答案 0 :(得分:3)

使用带有反向引用的否定前瞻:

^(?:(.)(?!\1\1))*$

使用您的示例查看live demo

(.)捕获第1组中的每个字符,并且前面的负面显示断言接下来的2个字符重复捕获的字符。

答案 1 :(得分:1)

我正在回答这个问题:

Is there a regular expression for matching a string that has no more than 2 repeating characters?

被标记为该问题的完全重复。


相反,取消比赛要快得多

if (!Regex.Match("hello world", @"(.)\1{2}").Success) Console.WriteLine("No dups");

答案 2 :(得分: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次不重复字符的所有字符串。

请注意,此解决方案使用负面预测,但并非所有正则表达式都支持它。