Как сопоставить все найденные строки, если они не содержат определенного слова? - PullRequest
2 голосов
/ 11 июля 2019

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

http.{5,10}(media.tumblr).+?(?!avatar).+?(png|jpg|jpeg|gif|swf)/g

в этом универсальномНапример, он должен соответствовать только 1º и 3º один, но он соответствует всем (цитирует конкретное соответствие):

1º"httpghghghmedia.tumblrfgdfdfgif"rdfgifgjdthythpng
2º"httpahttvhmedia.tumblrffdfavatarfgdfdfgif"rdfgifadadadadad
3ºdg"httpghghghmedia.tumblrfgdfdfgif"addadaa
4ºuilfgfgfpo"httpdsfsdfmedia.tumblrDDavatarsdfsdpng"

Я пробовал другие методы, некоторые даже были слишком сложными, чтобы заставить его работать, но большинствоответы на этот же вопрос или ссылки не учитывались, когда нужно было использовать дважды «. +?»или несколько шаблонов поиска, таких как «media.tumblr» и «gif» в разных местах, разделенных «. +?»Какой из моих тестов, предшествующий отрицательному взгляду, заставляет игнорировать отрицательный взгляд, так что кто-нибудь может сказать мне, если есть способ исправить это?regex101 и справочные руководства мне не помогли: /

1 Ответ

2 голосов
/ 11 июля 2019

TL; DR Full Regex

http.{5,10}(?:media.tumblr)(?:(?!avatar).)+?(?:png|jpg|jpeg|gif|swf)

Почему это не удается

.+?(?!avatar).+?<anything else>

Первый .+? соответствует одному символу (потому что он ленивый количественно). Если следующая строка avatar найдена, она также будет соответствовать a аватара. Второй .+? соответствует всему остальному, пока anything else не может быть сопоставлено.

Решение

Заменить деталь на

(?:(?!avatar).)+?<anything else>

Почему это работает

(?!avatar). соответствует одному символу, который не является началом строки avatar. Часть (?:(?!avatar).)+? (лениво) соответствует всем символам, которые выполняют это свойство. И если ни один из символов не является начальным символом avatar, строка не может содержаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...