2011-09-16 121 views
1

我需要这是一个正则表达式,因为它在Google Search Appliance的“不抓取”列表中。 (我相信Google正则表达式与GNU正则表达式类似。)所以我也没有选择使用代码(用任何语言)。正则表达式:只匹配字符串A和字符串B不匹配

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

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

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

因此:“blahblah/RFA/index.cfm?Review = 1 & blahblah”应该匹配。

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

顺便说一句,如果它简化了任何事情,当它存在时,bbb子字符串将始终位于aaa子字符串之后。

+1

你只需要负前瞻和回顾后,在两边的字符串中的任何点搜索“BBB”。 – Neil

+0

@Neil我不确定基本GNU正则表达式支持向前看和向后看。 – xanatos

+0

那么这是不可能的。前瞻性和逆向思维能够在周围环境中捕捉价值。另一种方法是捕获整个表达式,除非捕获组被允许。 – Neil

回答

-1

试试这个:

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

这是使用负前瞻,可能会或可能不会被你的正则表达式引擎支持。

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

编辑:

我认为我们已经看到了足够的证据说你的正则表达式引擎不会向前看。所以,我能想到的唯一的另一种方法是做2次测试:

/\/RFA\// 

/谷歌= YES/

,并在可接受的条件TEST1 & & TEST2,这将有!由您的代码完成比较测试的结果。不够干净,但它完成了工作。

+0

这是行不通的。不是部分可能在一开始就隐藏起来。 – tchrist

+0

在我的情况下,** not **部分总是在所需部分之后,但是,它仍然不起作用。 – Mike

+0

@Mike:它不能工作**,因为他忘记量化* not *部分。**请参阅我的意思。 – tchrist

0

唯一可行的方法是/foo/ && !/bar/。然而,还有其他卫生方法较差。

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

/foo/&&!/ bar /表达了我正在努力达到的目标,但是,您的解决方案与Google模式测试仪不匹配(GNU正则表达式不支持预览?) – Mike

0

注:GNU正则表达式,只是乔纳森后

@Jonathan修复无效。这是行不通的,因为。*会贪婪地捕捉到行尾,然后才尝试寻找Google=yes。所以它不会匹配Google=yes

此修改将更好地工作:

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

参见:http://codepad.org/hohjsdeI

+0

已更正。谢谢。 –