regex - 正则表达式从一组链接中过滤掉不包含产品关键字的链接
问题描述
我想使用 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:// 后的第一部分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+ 次除p
or以外的任何字符|
(?:
非捕获组p(?!roducts\b)
匹配p
,断言直接在右边的不是roducts
|
或者[^p|\r\n]
匹配除p
or|
或换行符之外的任何字符
)+
关闭非捕获组并重复 1 次以上(++
如果支持所有格量词,则使用)(?=\||$)
断言直接在右边的是|
或字符串的结尾
如果products
也不能在 url 从头开始,那么不仅在第一个正斜杠之后,模式可以缩短为:
https?://[^p|\r\n]*(?:p(?!roducts)|[^p|\r\n])+(?=\||$)
推荐阅读
- asp.net-core - 为请求记录添加自定义中间件时,模型绑定停止工作
- amazon-dynamodb - DynamoDB query for attlibute set
- sql - 在 SQL 查询中聚合和应用逻辑
- three.js - 环境贴图有边
- django - 如何将用户名添加到文件字段?
- php - SSH 隧道不工作 无法请求通道
- sql - 如何将几行连接成一行?
- python - 如何在连接的 Matplotlib Sankey 子图中创建相邻箭头之间的间隙
- regex - Nginx:如何将每个子文件夹重定向到各自的“公共”子文件夹
- python-3.x - 从同样为负数的图中计算绝对面积