带负向前瞻的正则表达式匹配范围超预期,求解决方法
解决正则匹配不带UUID的路径问题
测试案例
/templates/blue-business-bi-fold-brochure-4eef5269-0957-4f14-ad6c-1343a2fe75a3 /templates/flyers/4eef5269-0957-4f14-ad6c-1343a2fe75a3 /templates/brochures/theatre-playbill-program /templates/infographics/diversity-and-inclusion-terminology-infographic-dbc47165-dee4-478f-a0b9-313a54a5338a
目标
仅匹配第三个路径:/templates/brochures/theatre-playbill-program,即排除最后一段为UUID(8-4-4-4-12格式十六进制字符串)的路径。
问题根源
你提到的贪婪匹配问题,是因为原正则中使用.*(贪婪匹配任意字符),无法区分普通路径结尾和UUID结尾的情况,导致不符合要求的路径也被匹配。
解决方案
用[^/]+替代.*避免跨/的贪婪匹配,同时通过负向先行断言排除UUID格式的结尾,最终正则如下:
^/templates/[^/]+/(?!([0-9a-f]{8}-){3}[0-9a-f]{4}-[0-9a-f]{12}$)[^/]+$
正则细节解释
^/templates/:匹配路径开头的固定前缀[^/]+/:匹配模板类型(如brochures、flyers),[^/]+确保只匹配/分隔的单一段落,不会跨段贪婪匹配(?!...):负向先行断言,确保后续内容不是UUID格式([0-9a-f]{8}-){3}[0-9a-f]{4}-[0-9a-f]{12}$:精准匹配UUID结构,$确保UUID在路径结尾[^/]+$:匹配最后一段路径内容,直到字符串结尾
简化方案(仅匹配指定路径)
如果只需要精准匹配第三个目标路径,可直接使用:
^/templates/brochures/theatre-playbill-program$
内容的提问来源于stack exchange,提问作者JorgeeFG
相关产品推荐
相关产品推荐

