正则表达式积极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))
的理由如下:
匹配一个单词:
(\b\w+\b)
-
然后:
(?:
......|
...)
- 确保它以后再次出现:
(?=.*?\b\1\b)
-
或之前就已经出现了:
(?<=\b\1\b.*?\1)
,在回顾后第二
\1
刚之前匹配的词匹配。第一个\1
是真正的副本。
- 确保它以后再次出现:
回答编辑的问题:
如果你只想匹配一个重复的字的第一次出现,我们可以改变上面的图案有点:
(\b\w+\b)(?=.*?\b\1\b)(?<!\b\1\b.*?\1)
现在的逻辑是:
- 匹配一个单词:
(\b\w+\b)
- 确保它再次出现:
(?=.*?\b\1\b)
-
,并确保它没有发生之前:
(?<!\b\1\b.*?\1)
(不是一回事之前除了负面的后视)
我想匹配重复单词只有一次。我编辑了这个问题。抱歉。 –
@nocgod没问题,我扩大了答案 –
@Lucas_Trezsniewski太棒了!我一直在移动这些部件,不知道为什么我没有尝试简单的解决方案! –