正则表达式积极lookbehind +负向lookahead

问题描述:

给定一个字符串"A B C a b B"我想匹配重复的单词(无论大小写)。预期结果将匹配“A”和“B”(A的最后出现和B)或“A”和“B”(第一事件)正则表达式积极lookbehind +负向lookahead

编辑:我只想匹配第一个或最后一个发生这个词

我知道这个问题可以通过拆分字符串并计算每个令牌(降低该情况)来更好地回答。
但是,我想尝试制定一个正则表达式来帮助我找到这些词,只是为了练习。

我的第一次尝试是:(?=\b(\w+)\b.*\b(\1)\b)(\1)
但是它匹配第一个A,第一个B和第二个B(A B b)。

我想以某种方式使用正向后看负先行,以获取重复单词的最后一个实例:(?<=.*(?!.*(\w+).*)\1.*)\b\1\b
(在我的头上是翻译过来就是“那之前已经匹配,并荣获”一个字再次匹配“)

那么,它不适用于我不幸的。

是否可以使用积极的后视和负面预测这种方式?
我的正则表达式可以修复吗?
我试着在C#中解决它。

这不是功课

有趣的益智。这里是我的解决方案:

(\b\w+\b)(?:(?=.*?\b\1\b)|(?<=\b\1\b.*?\1)) 

Demo

的理由如下:

  • 匹配一个单词:(\b\w+\b)

  • 然后:(?: ...... | ... )

    • 确保它以后再次出现:(?=.*?\b\1\b)
    • 或之前就已经出现了:(?<=\b\1\b.*?\1)

      ,在回顾后第二\1刚之前匹配的词匹配。第一个\1是真正的副本。


回答编辑的问题:

如果你只想匹配一个重复的字的第一次出现,我们可以改变上面的图案有点:

(\b\w+\b)(?=.*?\b\1\b)(?<!\b\1\b.*?\1) 

Demo

现在的逻辑是:

  • 匹配一个单词:(\b\w+\b)
  • 确保它再次出现:(?=.*?\b\1\b)
  • ,并确保它没有发生之前:(?<!\b\1\b.*?\1)

    (不是一回事之前除了负面的后视)

+0

我想匹配重复单词只有一次。我编辑了这个问题。抱歉。 –

+0

@nocgod没问题,我扩大了答案 –

+0

@Lucas_Trezsniewski太棒了!我一直在移动这些部件,不知道为什么我没有尝试简单的解决方案! –