c# - 正则表达式正向后视+负向前视

标签 c# regex lookbehind negative-lookahead

给定一个字符串 "A B C a b B"我想匹配重复的单词(不管大小写)。预期结果将匹配“a”和“b”(A 和 B 的最后一次出现)或“A”和“B”(第一次出现)

编辑:我只想匹配单词的第一次或最后一次出现

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

我的第一次尝试是:(?=\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在lookbehind中匹配之前匹配的单词。第一个\1是真正的副本。


编辑问题的答案:

如果你只想匹配第一次出现的重复词,我们可以稍微改变一下上面的模式:

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

Demo

现在的逻辑是:

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

    (和以前一样,只是有一个负面的回顾)

关于c# - 正则表达式正向后视+负向前视,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31350659/

相关文章:

c# - Razor 页面 : Does OnGet Handler "accept" a request body?

c# - 超过 64 位的位掩码(标志)枚举,带有存储在数据库中的逻辑分组的位数组

javascript - 正则表达式:任何顺序的特定单词

java - (?<=#!)(\\w+\\.*\\w+)+ 与 #!super.compound.key3 不匹配

c# - XMLWorker 异常 : Object reference not set to an instance of an object

c# - 如何以编程方式将控件的文本字体颜色更改为自定义颜色

c# - .NET 的 Regex 类和换行符

regex - Haxe 中的模式替换

regex - 字符串,str_extract : how to do positive lookbehind?

javascript - 匹配给定的正则表达式,除非给定的单词存在(lookahead 或lookbehind)