如何在同一正则表达式中从srcset捕获组提取全部URL?
解决思路
你之前的表达式只能提取单个URL,核心原因是多数正则引擎中,重复嵌套的捕获组只会保留最后一次匹配的结果,哪怕你写了((http[^\s]+).*?)+,最终捕获组里也只会留下最后一个URL。
要把两个操作合并到单个正则里提取所有URL,分两种常用场景处理:
场景1:支持正向预查+全局匹配的正则引擎(如PCRE、Python re、JavaScript)
直接用这个正则,配合全局匹配模式即可:
(?i)(?<=srcset="|,\s*)http[^\s]+
逻辑说明:
(?i):忽略大小写匹配(?<=srcset="|,\s*):正向预查定位,匹配srcset="或者,(逗号加空格)之后的位置,确保每个URL的起始点都能被命中http[^\s]+:匹配从http开头到第一个空白字符的完整内容,也就是目标URL
用全局匹配(比如Python的re.findall()、JavaScript的/regex/g)测试你提供的源码,会直接得到所有URL:
https://www.thesite.nl/wp-content/uploads/2016/02/logo-home.png https://www.thesite.nl/wp-content/uploads/2016/02/logo-home-300x201.png https://www.thesite.nl/wp-content/uploads/2016/02/logo-home-768x514.png https://www.thesite.nl/wp-content/uploads/2016/02/logo-home-700x469.png
场景2:依赖捕获组+多次匹配的老旧正则引擎
如果必须通过捕获组提取,用这个表达式重复执行匹配直到无结果:
(?i)(?:srcset="|,\s*)(http[^\s]+)
逻辑说明:
(?:...):非捕获组,仅用来匹配URL的前置触发条件(srcset开头或逗号分隔符)(http[^\s]+):捕获单个目标URL
每次匹配会提取一个URL,重复执行就能拿到所有结果。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

