Golang正则提取URL路径时如何匹配获取包含目标字符的完整片段
问题描述
- 目标:从指定格式的流媒体链接字符串中提取固定位置的路径片段
- 待处理原始链接:
https://arteptweb-vh.akamaihd.net/i/am/ptweb/100000/100000/100095-000-A_0_VO-STE%5BANG%5D_AMM-PTWEB_XQ.1V7rLEYkPH.smil/master.m3u8
- 预期输出结果:
100000/100000/100095-000-A_ - 当前Golang环境使用的正则:
^.*?(/[i,na,fm,d]([,/]?)(/am/ptweb/|.+=.+,))([^_]*).*?$
- 故障表现:第4个捕获组仅返回
100000/100000/100095-000-A,缺失A字符后方的下划线,不符合预期。
故障原因
原正则第4个捕获组使用[^_]*作为匹配规则,该规则会连续匹配所有非下划线字符,遇到第一个下划线就立刻停止匹配,因此直接把目标片段末尾的下划线排除在捕获范围外,导致结果缺失。
修正方案
仅需调整第4个捕获组的匹配规则,将末尾的下划线纳入捕获范围即可,修正后正则如下:
^.*?(/[i,na,fm,d]([,/]?)(/am/ptweb/|.+=.+,))([^_]*_).*?$
- 调整逻辑:将原有捕获组的
([^_]*)修改为([^_]*_),在匹配完连续非下划线字符后,额外匹配紧接的第一个下划线,刚好覆盖预期结果的末尾字符。 - 验证结果:在Golang环境中使用该正则匹配目标链接,第4个捕获组将正确返回
100000/100000/100095-000-A_,符合预期。
补充说明:原正则字符组
[i,na,fm,d]中写入的逗号会被识别为需要匹配的普通字符,若业务场景不需要匹配路径中带逗号的情况,可以将该部分修正为(i|na|fm|d)提升匹配严谨性,不影响本次下划线缺失问题的修复。
内容的提问来源于stack exchange,提问作者TilakVarisetty
相关产品推荐
相关产品推荐

