我最近在Regex上一直在寻找很多,并且已经看到很多答案涉及一个单词的匹配,其中没有第二个单词。我已经看到了很多Regex Examples,我可以在其中使用正则表达式搜索给定的单词(或者更复杂的正则表达式)并查找缺少单词的位置。
在逐行的基础上看起来效果非常好,但在包含多行模式之后,它似乎仍然不能正常匹配。
Example:匹配包含单词foo
的整个文件字符串,但文件中不存在单词bar
。到目前为止我所拥有的是(?m)^(?=.*?(foo))((?!bar).)*$
,它基于example link。我一直在测试Ruby Regex测试器,但我认为这是一个开放式的正则表达式问题/问题。它似乎匹配较小的部分,我希望它在整个字符串上匹配/不匹配作为一个大块。
在上面提供的示例中,匹配是在逐行的基础上找到的。需要对正则表达式进行哪些更改才能应用于整个字符串?
编辑:我知道还有其他更有效的方法来解决这个问题,而不涉及使用正则表达式。我不是在寻找使用其他方法解决问题的方法,我是从理论正则表达式的角度来看。它有一个多线模式(看起来“工作”),它有负/正搜索,可以逐行组合,如何组合这两个主体不会产生预期的结果?
答案 0 :(得分:2)
匹配不包含foo
的整个字符串的正则表达式为:
/\A(?!.*foo.*).*\z/m
并且从包含bar
的整个字符串的开头匹配的正则表达式是:
/\A.*bar/m
既然你想要满足这两个要求,可以通过将其中一个放在前瞻中来结合这些:
/\A(?=.*bar)(?!.*foo.*).*\z/m
答案 1 :(得分:2)
.*
负责其余的事情:
/(?=.*foo)(?!.*bar).*/m
多行意味着.
也匹配\n
,并且匹配是贪婪的。所以整个字符串将匹配而不需要锚点。
更新
@Sawa为必要的\A
提供了一个很好的观点,但不是\Z
。
实际上,再看一遍,积极的前瞻似乎是不必要的:
/\A(?!.*bar).*foo.*/m