Соответствующая строка не содержит подстроки с регулярным выражением

Хорошо, я знаю, что это часто задаваемый вопрос, но мне не удалось получить то, что я хотел.

Я ищу регулярное выражение, чтобы найти шаблон, который не содержит конкретной подстроки.

Я хочу найти URL, который не содержит b параметр.

http://www.website.com/a=789&c=146          > MATCH
http://www.website.com/a=789&b=412&c=146    > NOT MATCH

В настоящее время у меня есть следующее регулярное выражение:\bhttp:\/\/www\.website\.com\/((?!b=[0-9]+).)*\b

Но я не прав с \bрегулярное выражение соответствует началу й строки и останавливается, когда оно находит b=вместо того, чтобы не соответствовать.

Смотрите: http://regex101.com/r/fN3zU5/3

Может кто-то помочь мне, пожалуйста?

6 ответов

Решение

Просто используйте заголовок, чтобы проверить, что после URL должен быть пробел или конец строки.

\bhttp:\/\/www\.website\.com\/(?:(?!b=[0-9]+).)*?\b(?= |$)

DEMO

Использовать этот:

^http:\/\/www\.website\.com\/((?!b=[0-9]+)).*$

\ b соответствует только окончанию слова.

^ соответствует началу и концу строки

и вам даже не нужно делать это так сложно, если вы не хотите URL с b параметр использовать это:

^http:\/\/www\.website\.com\/(?!b).*$

Демо здесь: http://regex101.com/r/fN3zU5/5

Вы посмотрели на эту возможность:

http://regex101.com/r/fN3zU5/6

^http:\/\/www\.website\.com\/[ac\=\d&]*$разрешить только &,=,a,c и цифры завершить URL в группе, и не должно быть параметра "b="

если у вас есть больше опций, и вы не хотите перечислять их все: вы не допускаете, чтобы 'b' было частью ваших параметров

^http:\/\/www\.website\.com\/[^b]*$

http://regex101.com/r/fN3zU5/7

^http:\/\/www\.website\.com\/(?!.*?b=.*?).*$ здесь тоже работает, "b=" разрешен в любой позиции строки параметра, так что вы даже можете иметь строку "b" в качестве значения параметра.

См. http://regex101.com/r/fN3zU5/8

      import re
      pattern=re.compile(r"(?!.*?b=.*).*")
      print pattern.match(x)

Это будет смотреть вперед, если присутствует "b=". Отрицательный прогноз означает, что он не будет соответствовать этой строке.

Это простой шаблон, не гибкий, но он работает:

 http:\/\/www\.website\.com\/+a=+\w+&+c=+\w+

Это то, что вы хотите. ^http:\/\/www\.website\.com\/(([^b]=[0-9]+).)*$

Другие вопросы по тегам