正则表达式在给定字符后忽略模式
问题描述:
我试图发现一个模式(在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(?=[^#]*$)
好主意!我有两个案件分开工作,但没有考虑将这样一个“大”对组合在一起的交替。我会尝试,thx! – rdnewman
你做了一件我想确定我明白的事情。两个子句中的'?= [^#] *'是为了确保在'$'或第一个'#'之前没有遇到注释,是正确的吗?我尝试过'?=。*#',但是这太过分了。我也为后面的部分尝试了'* [$ |#]',它也没有工作。你能否多解释一下,或者直接给我一个合适的资源?谢谢! – rdnewman
正确。点星有问题,因为点匹配任何东西,“任何东西”包括“#”。你可以通过使用一个非贪婪的星点('。*?')来缓解这个问题。“不哈希”或非贪婪的点星应该工作 - 这是一个问题或偏好。 –