首页 > 解决方案 > 正则表达式从一组链接中过滤掉不包含产品关键字的链接

问题描述

我想使用 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

标签: regex

解决方案


为什么模式不起作用

您尝试的模式不匹配,因为匹配 https:// 后的第一部分https:\/\/(?:(?!\|).)*匹配任何字符,因为右侧的内容不匹配|

这将匹配到第一个管道之前,并尝试匹配字符串开头的产品^products。但这不能匹配,因为它开始于https://

一个可能的解决方案

如果您想在第一个正斜杠之后匹配没有产品的 url,您可以使用匹配 not a的否定字符类|,并且p仅当后面的内容不是时才匹配 aorducts并断言字符串的结尾或下一个管道。

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

解释

  • https?://将 http 与可选的 s 匹配
  • [^/\r\n]+/匹配除/或换行符以外的任何字符 1 次以上,然后匹配/
  • [^p|]*匹配 0+ 次除por以外的任何字符|
  • (?:非捕获组
    • p(?!roducts\b)匹配p,断言直接在右边的不是roducts
    • |或者
    • [^p|\r\n]匹配除por|或换行符之外的任何字符
  • )+关闭非捕获组并重复 1 次以上(++如果支持所有格量​​词,则使用)
  • (?=\||$)断言直接在右边的是|或字符串的结尾

正则表达式演示

如果products也不能在 url 从头开始​​,那么不仅在第一个正斜杠之后,模式可以缩短为:

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

正则表达式演示


推荐阅读