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


103

我正在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的所有URL。

我知道要查找不包含另一个字符串的字符串,可以使用以下表达式:

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

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

任何帮助将不胜感激!

Answers:


144

应该这样做:

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

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


8
仅供参考,请访问regexr.com,以找到一种测试这些表达式的好方法。
约书亚·品特

永远不要忘记负面的前瞻,它是如此有用
Alexei Blue

"http://www.anydotcom.com/test/search.cfm?metric=blah&selector=sized&value=1" =~ /^(?!.*details\.cfm).*selector=size.*$/ #=> 0是不正确的。(请注意,字符串包含"...selector=sized..."。)而且,为什么要.*$结尾呢?
卡里·斯沃夫兰18'Dec

4

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

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

这是一个损坏的正则表达式,方括号将所有模式序列转换为单个字符的组合。
WiktorStribiżew19年

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

如果您的正则表达式引擎支持姿势量词(尽管我怀疑Google Analytics(分析)不支持),那么我认为这对于大型输入集会更好:

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

这假定selector=size总是在之前details.cfm,而在最后一个URL中则不是这样。
科比2010年

只是为了澄清这一点,不是我。我不明白为什么有人会在这里否决两个答案,它们都是正确的。
Kobi 2010年

@Kobi:这应该已经提前了,更正了。哦,顺便说一句,我不怀疑这是你的不赞成。
Tomalak 2010年

0

--line-buffered在OP和Kobi的解决方案对我来说非常有效的情况下,我一直在寻找一种避免出现类似情况的方法。就我而言,在包含' / '(对于我的根文档)时,请排除带有“ bot”或“ spider”的行。

我原来的命令:

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

现在变为(使用-Pperl开关):

tail -f mylogfile | grep -P '^(?!.*(bot|spider)).*\s\/\s.*$'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.