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

Я устанавливаю некоторые цели в 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}