2013-09-05 96 views
2

我需要一些正常表达式“包含”和“不包含”。 一般情况下我只是写:正则表达式 - 多于一个“不包含”/“包含”

包含:((* WORD_A *)。)$ 和 不包含:(^((?!WORD_A))*)$

这工作正常,如果单独使用,但我想写一些东西,可以检测到某事。像 “包含字A和字B”(为了不相关的!) 和 “包含A字,但不是字B)。

基本上我想的是,用户可以进行如下语句”与Word启动A,包含字B,但不包含C和/或以D结尾“并且程序返回真/假 最好的办法就是追加正则表达式 这是可能的吗?我无法弄清楚。

+0

我相信你会需要短短的单词列表循环,而不是尝试做每一个一次全部。 – Jonathon

+1

关于使用前瞻的第二个答案可能会帮助你:http://stackoverflow.com/questions/469913/regular-expressions-is-there-an-and-operator – mpellegr

+0

谢谢。循环播放列表并不是一种选择,因为它非常庞大,我需要观看演出,不过谢谢。 –

回答

4

对于你的榜样,我会用lookahead assertions这样的:

^WORD_A(?=.*WORD_B)(?!.*WORD_C).*WORD_D$ 

如果您愿意,您可以随时添加更多条件(只需添加另一个预览)。例如,如果你想匹配的是包含WORD_A和WORD_B并且不包含WORD_C也不WORD_D任何字符串:

^(?=.*WORD_A)(?=.*WORD_B)(?!.*WORD_C)(?!.*WORD_D) 
+0

这几乎完美,但为什么: (?=。* an)(?!。* This)匹配“这是一个信息”?负面前瞻不应该否定这一点吗? *编辑:它适用于锚点。非常感谢,我认为这对我有用。 :) –

+0

注意。 有两个“词”被合并的情况。例如,以“then”开始,以“end”结尾,并且您正在搜索“thend”。 它从那开始并结束,但'^ WORD_A。* WORD_D $'会失败。 – Jonathon

+1

@JonathonWisnoski:在这种情况下,你可以用lookahead做所有事情(就像我的更一般的第二个例子)。第一个例子是针对Florian在他的问题中概述的特定用例。 –