匹配不含有任何连续重复字符的字符串的正则表达式模式

3

我可以轻松编写一个正则表达式来匹配包含两个连续重复字符的字符串:

/(\w)\1/

如何进行补集操作?我想匹配不含有两个连续重复字符的字符串。我尝试了以下各种变化,但都没有成功:

/(\w)[^\1]/ ;doesn't work as hoped
/(?!(\w)\1)/ ;looks ahead, but some portion of the string will match
/(\w)(?!\1)/ ;again, some portion of the string will match

我不想使用任何特定于语言/平台的方式来对正则表达式取反。我想要一个直接简单的方法来实现这一点。


try ^(?!.*(\w)\1).* - Avinash Raj
发布一些示例以及预期输出? - Avinash Raj
@AvinashRaj - 那个方法有效!我不太确定为什么它有效... 我想我需要阅读一下关于前瞻的资料,因为我显然并没有完全理解。请把你的回复写成一个答案。 - at.
1个回答

2
下面的正则表达式将匹配那些没有重复字符的字符串。
^(?!.*(\w)\1).*

(?!.*(\w)\1) 负向预查,它断言将要匹配的字符串不包含任何重复的字符。 .*(\w)\1 将匹配具有在中间、开头或结尾处重复字符的字符串。 ^(?!.*(\w)\1) 匹配除了有重复字符的起始边界之外的所有起始边界。接下来的 .* 匹配该行上存在的所有字符。请注意,这也匹配空字符串。如果您不想匹配空行,则将最后的 .* 更改为 .+

请注意,^(?!(\w)\1) 仅检查字符串或行的开头是否有重复的字符。

预查和回顾,统称为“预测”,与行的开头和结尾一样,是零长度断言。它们不消耗字符串中的字符,而只是断言是否可能存在匹配。预测允许您创建无法在没有它们的情况下创建的正则表达式,或者在没有它们的情况下会变得非常冗长。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接