Я хочу отфильтровать ссылки из группы ссылок, которая не содержит слово продукта, используя 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

1
Musakkhir Sayyed 15 Авг 2019 в 15:23

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+ раз (или используйте ++, если поддерживаются квантификаторы притяжений)
  • (?=\||$) Утверждают, что прямо справа находится | или конец строки
  • Regex demo

    Если products также не может быть в url с самого начала, то есть не только после первого слеша, шаблон может быть сокращен до:

    https?://[^p|\r\n]*(?:p(?!roducts)|[^p|\r\n])+(?=\||$)
    

    Regex demo

    1
    The fourth bird 15 Авг 2019 в 14:15

    Предполагая, что ваш исходный шаблон на самом деле верен, одним из простых способов справиться с отрицательным регистром будет использование отрицательного прогноза:

    (https:\/\/(?:(?!\|).)*(?!products)\w*(?:(?!\|).)*.(?=\||$))
    

    Это то, что, как я полагаю, вы намеревались сделать. Взгляд (?!products) утверждает, что за этим точным местом стоит , а не products. Затем \w* соответствует любому действительному слову, которое на самом деле следует.

    0
    Tim Biegeleisen 15 Авг 2019 в 12:33