Регулярное выражение для строки, содержащей одно слово, а не другое
я настраиваю некоторые цели в 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.*$'