正则表达式:仅在找到字符串A且不在字符串B时匹配

时间:2011-09-16 16:11:42

标签: regex

我需要将其作为单个正则表达式,因为它位于Google Search Appliance的“请勿抓取”列表中。 (我相信Google正则表达式与GNU正则表达式类似。)所以我也没有选择使用代码(使用任何语言)。

之前已经问过这个问题,但答案通常是代码而不是正则表达式。

我想要做的是匹配一个字符串,如果它包含子字符串aaa,只要它不包含子字符串bbb。

作为一个更具体的例子:如果字符串包含“/ RFA /”,我想匹配,但如果它不包含“Google = yes”,则匹配。

所以:“blahblah / RFA / index.cfm?评论= 1& blahblah”应该匹配。

但是:“blahblah / RFA / index.cfm?Review = 1& Google = yes& blahblah”应该会失败。

顺便说一下,如果它简化了任何东西,当它出现时,bbb子串总是在aaa子串之后。

3 个答案:

答案 0 :(得分:0)

唯一明智的做法是/foo/ && !/bar/。然而,还有其他不太卫生的方法。

/^ (?= (?!NOPAT) . )* $ ) YESPAT /xs

答案 1 :(得分:0)

注意:对GNU正则表达式无效,只是修复了Jonathan的帖子

@Jonathan。这是行不通的,因为。*将贪婪地捕获到行的末尾,然后才尝试查找Google=yes。所以它永远不会匹配Google=yes

此修改将更有效:

/^.*\/RFA\/(?!.*Google=yes)/

请参阅:http://codepad.org/hohjsdeI

答案 2 :(得分:-1)

试试这个:

/^.*\/RFA\/(?!.*Google=yes)/

这是使用否定前瞻,你的正则表达式引擎可能支持也可能不支持。

=============================================== ==========================

编辑:

我认为我们已经看到足够的证据表明你的正则表达式引擎没有预见到。所以我能想到的另一种方法是进行2次测试:

/\/RFA\//

/谷歌= YES /

且可接受的条件是TEST1&& !TEST2,必须由您的代码完成,比较测试结果。不那么干净,但它完成了工作。