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

问题描述 投票:0回答:2

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

  • abaaaa [不匹配]
  • abawdasd [比赛]
  • abbbbasda [不匹配]
  • bbabbabba [比赛]

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

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

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

regex regex-negation
2个回答
3
投票

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

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

请参阅live demo使用您的示例。

(.)捕获组1中的每个字符,而负向前视断言接下来的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的数量将是你允许连续重复一个角色的次数,而且你不会得到匹配。

EG

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

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

© www.soinside.com 2019 - 2024. All rights reserved.