【发布时间】:2017-02-12 23:21:31
【问题描述】:
我正在尝试发现一种模式(在 Ruby 源代码文件中),但如果在内联注释中找到该模式(即在 # 字符之后),则忽略该模式。
例如,给定这个文本
foo.bar foo foo::bar # foo.bar foo::bar
我希望捕获foo 的第一个 (foo.bar) 和第三个 (foo::bar) 案例,其余的忽略(第二个没有立即尾随 . 或 :: , 第四个和第五个出现在# 之后,所以应该忽略。
对于这个文本,
foo.bar foo foo::bar
它仍然应该以相同的方式拾取第一个和第三个(因为没有评论可以忽略)。
我有各种技术可以解决这个问题,但没有一个能满足所有情况。 Lookbehind 很有希望,但无法在我的正则表达式方言(Ruby)中处理可变长度。
因此,((?<!\#.*)foo[\.|:{2}]) 不起作用,因为它是可变长度的(并且,正如所写,无论如何只会排除 # 之后的第一个实例)
(.+?(?=#)) 也很有希望,所以我尝试了((foo(\.|\:{2})).+)?(?=\#),这很接近,但看不出有 2 个 foos 在第一个之后。匹配组只返回foo.bar foo foo::bar,但它会适当地忽略# 之后的任何内容。我很确定是 .+ 造成了不好的区别,但对此的其他修改似乎并没有让我更接近。
显然,我不知道该怎么做,并开始怀疑这是否可能。
[编辑:添加第二个例子]
【问题讨论】:
标签: regex regex-negation regex-lookarounds regex-greedy