正则表达式模式匹配字符串,没有任何2个连续重复字符

时间:2015-03-21 04:12:01

标签: regex regex-negation regex-lookarounds

我可以很容易地编写正则表达式来匹配包含2个连续重复字符的字符串:

/(\w)\1/

我该如何补充?我想匹配不具有2个连续重复字符的字符串。我尝试了以下各种变体而没有成功:

/(\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

我不希望任何语言/平台特定的方式来取消正则表达式的否定。我想要直截了当的方式来做到这一点。

1 个答案:

答案 0 :(得分:2)

以下正则表达式将匹配没有任何重复字符的字符串。

^(?!.*(\w)\1).*

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

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

Lookahead和lookbehind,统称为"lookaround",是零长度断言,就像行的起点和终点一样。它们不消耗字符串中的字符,但仅断言是否可以匹配。 Lookaround允许您创建在没有它们的情况下无法创建的正则表达式,或者在没有它们的情况下创建非常长的正则表达式。