Я устанавливаю некоторые цели в 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).)*$)
Но я не уверен, как добавить в раздел selector = size.
Любая помощь будет принята с благодарностью!
Ответ 1
Это должно сделать это:
^(?!.*details\.cfm).*selector=size.*$
^.*selector=size.*$
должен быть достаточно ясным. Первый бит, (?!.*details.cfm)
является негативным прогнозом: перед сопоставлением строки, которую он проверяет, строка не содержит "details.cfm" (с любым количеством символов перед ней).
Ответ 2
regex может быть (синтаксис perl):
`/^[(^(?!.*details\.cfm).*selector=size.*)|(selector=size.*^(?!.*details\.cfm).*)]$/`
Ответ 3
^(?=.*selector=size)(?:(?!details\.cfm).)+$
Если ваш двигатель regex поддерживает важные квантификаторы (хотя я подозреваю, что Google Analytics этого не делает), я думаю, что это будет лучше работать для больших наборов ввода:
^[^?]*+(?<!details\.cfm).*?selector=size.*$
Ответ 4
Я искал способ избежать буферизации на хвосте в той же ситуации, что и решение OP и Kobi отлично подходит для меня. В моем случае исключая строки с "ботом" или "пауком", включая "/" (для моего корневого документа).
Моя первоначальная команда:
tail -f mylogfile | grep --line-buffered -v 'bot\|spider' | grep ' / '
Теперь (с переключателем "-P" perl):
tail -f mylogfile | grep -P '^(?!.*(bot|spider)).*\s\/\s.*$'
Ответ 5
Простой способ сделать это - указать 0 экземпляров строки, выполнив следующие
(string_to_exclude){0}