我可以很容易地编写正则表达式来匹配包含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
我不希望任何语言/平台特定的方式来取消正则表达式的否定。我想要直截了当的方式来做到这一点。
答案 0 :(得分:2)
以下正则表达式将匹配没有任何重复字符的字符串。
^(?!.*(\w)\1).*
(?!.*(\w)\1)
否定前瞻,断言要匹配的字符串不包含任何重复的字符。 .*(\w)\1
将匹配在中间或开头或结尾处重复字符的字符串。 ^(?!.*(\w)\1)
匹配除重复字符之外的所有起始边界。以下.*
匹配该特定行上存在的所有字符。请注意,这也匹配空字符串。如果您不想匹配空行,请将最后的.*
更改为.+
请注意^(?!(\w)\1)
仅在字符串或行的开头检查重复的字符。
Lookahead和lookbehind,统称为"lookaround",是零长度断言,就像行的起点和终点一样。它们不消耗字符串中的字符,但仅断言是否可以匹配。 Lookaround允许您创建在没有它们的情况下无法创建的正则表达式,或者在没有它们的情况下创建非常长的正则表达式。