正则表达式,避免匹配连续字符

时间:2020-05-12 09:06:36

标签: regex

我正在尝试提高我的正则表达式技能。 我无法管理此练习。

https://alf.nu/RegexGolf

您必须匹配没有连续相同字符的单词。 为了清楚起见,我们应该避免使用abba或baab czzc之类的模式。

我看到的唯一方法是使用捕获组:

([a-z])([a-z])\2\1

然后进行负面预测:

(?!([a-z])([a-z])\2\1)

但是在该站点上它不起作用,因为它与任何内容都不匹配。

有什么建议吗? 谢谢

3 个答案:

答案 0 :(得分:1)

使用否定前瞻:

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

说明:

^               from the start of the input
    (?:
        (.)     match AND capture a single character
        (?!\1)  then assert that what follows is a different character (not the same)
    )*          match zero or more such matching characters
$               end of the input

Demo

另一种可能更清洁的方法是在模式开始时先进行全局负向预测:

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

这将在一开始就断言在字符串中的任何位置都没有重复的字符。

答案 1 :(得分:0)

感谢蒂姆·比格莱森(Tim Biegeleisen),这是答案。 ^(?!.*(.)(.)\2\1).*$

答案 2 :(得分:0)

^(?! cr | pal | tar)[a-z] {1,4}([a-z])\ 1 [a-z] {0,5} $ 在您给的链接中,这对我有用。我猜我们必须将模式与连续的字母匹配。但是有一些例外,一开始我不得不用负面的眼光看待。我已经使用([[a-z])\ 1来匹配连续的字符,并用可能的限制字符包围。希望这可以帮助! 随附屏幕截图以供参考。

https://i.stack.imgur.com/va1Uq.png