Регулярное выражение для строки, содержащей одно слово, а не другое

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

допустим, у меня есть 4 URLs

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, содержащий строку селектор=размер, но не содержит подробности.cfm

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

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

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

любая помощь была бы весьма признательна!

5 ответов


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

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

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


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

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

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

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

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

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

моя первоначальная команда:

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

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

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

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

(string_to_exclude){0}