Регулярное выражение для строки, содержащей одно слово, но не другое - PullRequest
84 голосов
/ 02 июня 2010

Я устанавливаю некоторые цели в Google Analytics и могу использовать небольшую справочную информацию по регулярным выражениям.

Допустим, у меня есть 4 URL

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

Я хочу создать выражение, которое будет идентифицировать любой URL, который содержит строку selector = size , но НЕ содержит details.cfm

Я знаю, что для поиска строки, которая НЕ содержит другую строку, я могу использовать это выражение:

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

Но я не уверен, как добавить в селектор = размер .

Любая помощь будет принята с благодарностью!

Ответы [ 5 ]

118 голосов
/ 02 июня 2010

Это должно сделать это:

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

^.*selector=size.*$ должно быть достаточно ясно. Первый бит (?!.*details.cfm) является отрицательным прогнозом: перед сопоставлением строки он проверяет, не содержит ли строка "details.cfm" (с любым количеством символов перед ним).

4 голосов
/ 02 июня 2010

регулярное выражение может быть (синтаксис Perl):

`/^[(^(?!.*details\.cfm).*selector=size.*)|(selector=size.*^(?!.*details\.cfm).*)]$/`
1 голос
/ 02 июня 2010
^(?=.*selector=size)(?:(?!details\.cfm).)+$

Если ваш движок регулярных выражений поддерживает количественные квантификаторы (хотя я подозреваю, что Google Analytics нет), то я думаю, это будет лучше для больших наборов ввода:

^[^?]*+(?<!details\.cfm).*?selector=size.*$
0 голосов
/ 16 июня 2016

Я искал способ избежать --line-buffered на хвосте в подобной ситуации, так как OP и решение Kobi прекрасно работают для меня. В моем случае исключая строки с «ботом» или «пауком», включая «/» (для моего корневого документа).

Моя оригинальная команда:

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

Теперь становится (с переключателем Perl "-P"):

tail -f mylogfile | grep -P '^(?!.*(bot|spider)).*\s\/\s.*$'
0 голосов
/ 27 июля 2012

Простой способ сделать это - указать 0 экземпляров строки, выполнив следующее

(string_to_exclude){0}
...