【问题标题】:What is the regex to match a string not containing more than x consecutive characters匹配不包含超过 x 个连续字符的字符串的正则表达式是什么
【发布时间】:2016-10-05 17:01:50
【问题描述】:

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

  • abaaaa [不匹配]​​
  • abawdasd [匹配]
  • abbbbasda [不匹配]​​
  • babbabba [匹配]

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

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

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

【问题讨论】:

  • 我添加了这个问题,因为我在网上找不到答案。我在其他 SO 问题的帮助下得出了答案。所以,我认为分享答案会很好。

标签: regex regex-negation


【解决方案1】:

使用带有反向引用的负前瞻:

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

使用您的示例查看live demo

(.) 捕获第 1 组中的每个字符,并且否定前瞻断言接下来的 2 个字符不是捕获的字符的重复。

【讨论】:

  • 1up 为专业模式!我会像这样改进它^(?:(.)(?!\1{2}))*$
【解决方案2】:

要匹配不包含连续重复超过 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 的数量将是您允许一个字符连续重复的次数,再多就不会匹配了。

例如

  • ^((.)\2?(?!\2\2\2))+$ 将匹配所有连续重复一个字符不超过 4 次的字符串。

  • ^((.)\2?(?!\2\2\2\2))+$ 将匹配所有连续重复一个字符不超过 5 次的字符串。

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

【讨论】:

    【解决方案3】:

    我正在回答这个问题:

    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");
    

    【讨论】:

      猜你喜欢
      • 2016-04-21
      • 1970-01-01
      • 1970-01-01
      • 2018-07-25
      • 2016-01-16
      • 2015-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多