正则表达式在给定字符后忽略模式

问题描述:

我试图发现一个模式(在Ruby源代码文件中),但是如果在内联注释中发现(即在#字符之后)则忽略该模式。正则表达式在给定字符后忽略模式

例如,给定本文 foo.bar foo foo::bar # foo.bar foo::bar

我想第一(foo.bar)和foo第三(foo::bar)的情况下被捕获,其余忽略(第二不具有立即尾随.::,第四次和第五次出现后#,因此应该被忽略。

对于这样的文字, foo.bar foo foo::bar

它应该仍然以相同的方式拾取第一个和第三个(因为没有要忽略的评论)。

我有各种各样的技术,得到这件事,但没有满足所有情况下。后视是有希望的,但无法处理我的正则表达式方言(Ruby)中的变量长度。

因此,((?<!\#.*)foo[\.|:{2}])不会工作,因为它是可变长度(并且,作为写,只会排除#反正后的第一个实例)

(.+?(?=#))被看好过了,所以我想((foo(\.|\:{2})).+)?(?=\#),这就是接近,但没有看到区分在第一个之后有2个foo。比赛组只返回foo.bar foo foo::bar,但它确实忽略了#之后的任何内容。我很确定这是造成差距的.+,但其他修正似乎并没有让我更接近。

很明显,我没有得到如何去之后,开始怀疑是否有可能。

[编辑:添加第二个例子]

我不Ruby的工作,但是从你的描述听起来像Ruby不支持*量词lookbehinds。这当然会让它更加困难。但是,您可以利用无限的预览。你可以有检查没有行内注释foo_bar个正则表达式:

^[^#]*foo(?:\.|::)bar(?=[^#]*$) 

...和检查foo_bar s表示确实有内部注释的正则表达式:

foo(?:\.|::)bar(?=[^#]*#) 

。 ..只是把它们放在一起交替:

foo(?:\.|::)bar(?=[^#]*#)|^[^#]*foo(?:\.|::)bar(?=[^#]*$) 
+0

好主意!我有两个案件分开工作,但没有考虑将这样一个“大”对组合在一起的交替。我会尝试,thx! – rdnewman

+0

你做了一件我想确定我明白的事情。两个子句中的'?= [^#] *'是为了确保在'$'或第一个'#'之前没有遇到注释,是正确的吗?我尝试过'?=。*#',但是这太过分了。我也为后面的部分尝试了'* [$ |#]',它也没有工作。你能否多解释一下,或者直接给我一个合适的资源?谢谢! – rdnewman

+0

正确。点星有问题,因为点匹配任何东西,“任何东西”包括“#”。你可以通过使用一个非贪婪的星点('。*?')来缓解这个问题。“不哈希”或非贪婪的点星应该工作 - 这是一个问题或偏好。 –