0

我最近在 Regex 上浏览了很多内容,并且看到了很多涉及匹配一个单词的答案,而第二个单词则不存在。我看过很多正则表达式示例,我可以在其中使用正则表达式搜索给定的单词(或任何更复杂的正则表达式)并找到缺少单词的位置。

似乎在逐行的基础上工作得很好,但是在包括多行模式之后,它似乎仍然不能正确匹配。

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

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

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

4

2 回答 2

2

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

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

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

/\A.*bar/m

由于您想同时满足这两个,因此通过将其中一个放在前瞻中来将它们结合起来:

/\A(?=.*bar)(?!.*foo.*).*\z/m
于 2013-03-05T19:54:27.783 回答
2

Sawa 的答案可以简化,所需要的只是一个积极的前瞻,一个消极的前瞻,并且由于你处于多行模式,.*剩下的就是:

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

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

更新

@Sawa 提出了\A必要但不是\Z. 实际上,再看一遍,积极的前瞻似乎是不必要的:

/\A(?!.*bar).*foo.*/m
于 2013-03-05T22:00:58.100 回答