多行正则表达式:找到B不存在的地方

时间:2013-03-05 19:07:07

标签: ruby regex

我最近在Regex上一直在寻找很多,并且已经看到很多答案涉及一个单词的匹配,其中没有第二个单词。我已经看到了很多Regex Examples,我可以在其中使用正则表达式搜索给定的单词(或者更复杂的正则表达式)并查找缺少单词的位置。

在逐行的基础上看起来效果非常好,但在包含多行模式之后,它似乎仍然不能正常匹配。

Example:匹配包含单词foo的整个文件字符串,但文件中不存在单词bar。到目前为止我所拥有的是(?m)^(?=.*?(foo))((?!bar).)*$,它基于example link。我一直在测试Ruby Regex测试器,但我认为这是一个开放式的正则表达式问题/问题。它似乎匹配较小的部分,我希望它在整个字符串上匹配/不匹配作为一个大块。

在上面提供的示例中,匹配是在逐行的基础上找到的。需要对正则表达式进行哪些更改才能应用于整个字符串?

编辑:我知道还有其他更有效的方法来解决这个问题,而不涉及使用正则表达式。我不是在寻找使用其他方法解决问题的方法,我是从理论正则表达式的角度来看。它有一个多线模式(看起来“工作”),它有负/正搜索,可以逐行组合,如何组合这两个主体不会产生预期的结果?

2 个答案:

答案 0 :(得分:2)

匹配不包含foo的整个字符串的正则表达式为:

/\A(?!.*foo.*).*\z/m

并且从包含bar的整个字符串的开头匹配的正则表达式是:

/\A.*bar/m

既然你想要满足这两个要求,可以通过将其中一个放在前瞻中来结合这些:

/\A(?=.*bar)(?!.*foo.*).*\z/m

答案 1 :(得分:2)

Sawa的答案可以简化,所需要的只是一个积极的前瞻,一个负面的前瞻,而且由于你处于多线模式,.*负责其余的事情:

/(?=.*foo)(?!.*bar).*/m

多行意味着.也匹配\n,并且匹配是贪婪的。所以整个字符串将匹配而不需要锚点。

更新

@Sawa为必要的\A提供了一个很好的观点,但不是\Z。 实际上,再看一遍,积极的前瞻似乎是不必要的:

/\A(?!.*bar).*foo.*/m