包含一个词但不包含另一个词的字符串的正则表达式

时间:2010-06-01 20:21:46

标签: regex google-analytics regex-negation

我在Google Analytics中设置了一些目标,可以使用一些正则表达式帮助。

假设我有4个网址

http://www.anydotcom.com/test/search.cfm?metric=blah&selector=size&value=1
http://www.anydotcom.com/test/search.cfm?metric=blah2&selector=style&value=1
http://www.anydotcom.com/test/search.cfm?metric=blah3&selector=size&value=1
http://www.anydotcom.com/test/details.cfm?metric=blah&selector=size&value=1

我想创建一个表达式,用于标识包含字符串 selector = size 的任何网址,但不包含 details.cfm

我知道要找到一个不包含其他字符串的字符串,我可以使用这个表达式:

(^((?!details.cfm).)*$)

但是,我不确定如何添加 selector = size 部分。

非常感谢任何帮助!

6 个答案:

答案 0 :(得分:114)

这应该这样做:

^(?!.*details\.cfm).*selector=size.*$

^.*selector=size.*$应该足够明确。第一位(?!.*details.cfm)是否定前瞻:在匹配字符串之前,它检查字符串不包含“details.cfm”(前面有任意数量的字符)。

答案 1 :(得分:5)

正则表达式可能是(perl语法):

`/^[(^(?!.*details\.cfm).*selector=size.*)|(selector=size.*^(?!.*details\.cfm).*)]$/`

答案 2 :(得分:1)

^(?=.*selector=size)(?:(?!details\.cfm).)+$

如果你的正则表达式引擎支持大量量词(虽然我怀疑谷歌分析没有),那么我想这对于大型输入集会表现更好:

^[^?]*+(?<!details\.cfm).*?selector=size.*$

答案 3 :(得分:1)

接受的答案中的正则表达式有问题。它Pathlib abcselector=sizeselector=sizeabc

正确的正则表达式可以是 ^(?!.*\bdetails\.cfm\b).*\bselector=size\b.*$

also matches 处正则表达式的解释:

regex101

答案 4 :(得分:0)

我正在寻找一种方法来避免在线路上缓冲 - 在OP和Kobi的解决方案对我来说非常适合的类似情况下缓冲。在我的情况下,排除使用&#34; bot&#34;或者&#34;蜘蛛&#34;同时包括&#39; /&#39; (对于我的根文档)。

我的原始命令:

tail -f mylogfile | grep --line-buffered -v 'bot\|spider' | grep ' / '

现在变为(使用&#34; -P&#34; perl开关):

tail -f mylogfile | grep -P '^(?!.*(bot|spider)).*\s\/\s.*$'

答案 5 :(得分:-4)

执行此操作的简单方法是通过执行以下操作指定字符串的0个实例

(string_to_exclude){0}