匹配不包含超过 x 个连续字符的字符串的正则表达式是什么
What is the regex to match a string not containing more than x consecutive characters
我想匹配连续重复的相同字符不超过 3 个的字符串。所以:
- abaaaa[不匹配]
- abawdasd [匹配]
- abbbbasda [不匹配]
- bbabbabba [匹配]
是的,做一个包含连续字符的正则表达式匹配,然后在之后的代码中取反会更容易和整洁。但是,在这种情况下这是不可能的。
我想把问题展开成x个连续的字符,这样可以扩展到一般情况,让问答更有用。
在这种情况下支持负前瞻。
要匹配不包含连续重复超过 3 次的字符的字符串:
^((.)?(?!))+$
工作原理:
^ Start of string
(
(.) Match any character (not a new line) and store it for back reference.
? Optionally match one more exact copies of that character.
(?! Make sure the upcoming character(s) is/are not the same character.
Repeat '' for as many times as you need
)
)+ Do ad nauseam
$ End of string
因此,整个表达式中 /2
的数量将是您允许一个字符连续重复的次数,如果再多,您将无法匹配。
例如
^((.)?(?!))+$
将匹配所有连续重复一个字符不超过 4 次的字符串。
^((.)?(?!))+$
将匹配所有连续重复一个字符不超过 5 次的字符串。
请注意此解决方案使用了否定先行,但并非所有正则表达式风格都支持它。
对反向引用使用负前瞻:
^(?:(.)(?!))*$
请参阅 live demo 使用您的示例。
(.)
捕获第 1 组中的每个字符,否定前瞻断言接下来的 2 个字符是 not 捕获字符的重复。
我正在回答这个问题:
Is there a regular expression for matching a string that has no more than 2 repeating characters?
它被标记为与此问题完全相同。
相反,取消匹配要快得多
if (!Regex.Match("hello world", @"(.){2}").Success) Console.WriteLine("No dups");
我想匹配连续重复的相同字符不超过 3 个的字符串。所以:
- abaaaa[不匹配]
- abawdasd [匹配]
- abbbbasda [不匹配]
- bbabbabba [匹配]
是的,做一个包含连续字符的正则表达式匹配,然后在之后的代码中取反会更容易和整洁。但是,在这种情况下这是不可能的。
我想把问题展开成x个连续的字符,这样可以扩展到一般情况,让问答更有用。
在这种情况下支持负前瞻。
要匹配不包含连续重复超过 3 次的字符的字符串:
^((.)?(?!))+$
工作原理:
^ Start of string
(
(.) Match any character (not a new line) and store it for back reference.
? Optionally match one more exact copies of that character.
(?! Make sure the upcoming character(s) is/are not the same character.
Repeat '' for as many times as you need
)
)+ Do ad nauseam
$ End of string
因此,整个表达式中 /2
的数量将是您允许一个字符连续重复的次数,如果再多,您将无法匹配。
例如
^((.)?(?!))+$
将匹配所有连续重复一个字符不超过 4 次的字符串。^((.)?(?!))+$
将匹配所有连续重复一个字符不超过 5 次的字符串。
请注意此解决方案使用了否定先行,但并非所有正则表达式风格都支持它。
对反向引用使用负前瞻:
^(?:(.)(?!))*$
请参阅 live demo 使用您的示例。
(.)
捕获第 1 组中的每个字符,否定前瞻断言接下来的 2 个字符是 not 捕获字符的重复。
我正在回答这个问题:
Is there a regular expression for matching a string that has no more than 2 repeating characters?
它被标记为与此问题完全相同。
相反,取消匹配要快得多
if (!Regex.Match("hello world", @"(.){2}").Success) Console.WriteLine("No dups");