Я хочу отфильтровать ссылки из группы ссылок, которая не содержит слово продукта, используя REGEX. Группа ссылок ограничена |.
У меня есть следующее регулярное выражение, чтобы соответствовать со словом продуктов.
(https:\/\/(?:(?!\|).)*(products)(?:(?!\|).)*.(?=\||$))
Когда я пытался получить список ссылок, который не содержит слова продукта, он не показывает мне никакого результата.
(https:\/\/(?:(?!\|).)*(^products)(?:(?!\|).)*.(?=\||$))
Ссылки приведены ниже.
https://cdn.shopify.com/test/|https://cdn.shopify.com/s/products/Profile.jpg|https://cdn.shopify.com/p/products/1Profile.jpg?v=359|https://cdn.shopify.com/s/4/files/products/19front.jpg?v=453|https://cdn.shopify.com/g/p/Chart.jpg?v=1549402459|https://cdn.shopify.com/s/4/products/19back.jpg?v=453
Пожалуйста, дайте мне то, что мне не хватает? Я пробовал !?
и ^
. с таким же условием.
https://regex101.com/r/Ynj8ni/1
2 ответа
Почему шаблон не работает
Использованный вами шаблон не соответствует, потому что первая часть после соответствия https: // https:\/\/(?:(?!\|).)*
соответствует любому символу, поскольку то, что находится справа, не является |
Это будет соответствовать прямо перед первым каналом, и попытки сопоставить продукты в начале строки ^products
. Но это не может быть сопоставлено, так как начинается с https://
Возможное решение
Если вы хотите сопоставить URL без продуктов после первой косой черты, вы можете использовать отрицательный класс символов не соответствует |
и соответствует p
только в том случае, если последующее не orducts
, и утверждает конец строки или следующий канал.
https?://[^/\r\n]+/[^p|]*(?:p(?!roducts\b)|[^p|\r\n])+(?=\||$)
Объяснение
https?://
Сопоставить http с необязательными s[^/\r\n]+/
Соответствует 1+ раз любому символу, кроме/
или новой строки, затем соответствует/
[^p|]*
Соответствует 0+ раз любому символу, кромеp
или|
(?:
Группа без захвата < UL>-
p(?!roducts\b)
Соответствуетp
, утверждая, что то, что прямо справа, не являетсяroducts
-
|
или -
[^p|\r\n]
Соответствует любому символу, кромеp
или|
или новой строки
)+
Закройте группу без захвата и повторите 1+ раз (или используйте ++
, если поддерживаются квантификаторы притяжений)(?=\||$)
Утверждают, что прямо справа находится |
или конец строкиЕсли products
также не может быть в url с самого начала, то есть не только после первого слеша, шаблон может быть сокращен до:
https?://[^p|\r\n]*(?:p(?!roducts)|[^p|\r\n])+(?=\||$)
Предполагая, что ваш исходный шаблон на самом деле верен, одним из простых способов справиться с отрицательным регистром будет использование отрицательного прогноза:
(https:\/\/(?:(?!\|).)*(?!products)\w*(?:(?!\|).)*.(?=\||$))
Это то, что, как я полагаю, вы намеревались сделать. Взгляд (?!products)
утверждает, что за этим точным местом стоит , а не products
. Затем \w*
соответствует любому действительному слову, которое на самом деле следует.
Похожие вопросы
Новые вопросы
regex
Регулярные выражения предоставляют декларативный язык для сопоставления шаблонов в строках. Они обычно используются для проверки строк, разбора и преобразования. Укажите язык (PHP, Python и т. д.) или инструмент (grep, VS Code, Google Analytics и т. д.), который вы используете. Не размещайте вопросы, требующие объяснения того, что означает символ или чему будет соответствовать конкретное регулярное выражение.