如何编写正则匹配双大括号内携带24位十六进制ID的字符串
原正则的问题
你当前使用的/{{.*?[0-9a-fA-F]{24}}}/gm存在三个核心问题:
.*?作为惰性匹配,默认可以匹配}字符,会出现跨{{}}块的错误匹配:比如遇到{{xxx|123}} xxxx {{xxx|24位ID}}这类内容时,正则会从第一个{{开始匹配,一直吞到第二个}}结束,把整段不符合要求的内容也纳入匹配结果。- 没有限制24位十六进制ID必须紧挨着闭合的
}},如果某个{{}}块中间刚好出现连续24位十六进制字符、末尾ID长度不足,也会被误匹配。 - 默认的
.元字符不匹配换行符,你示例中存在跨换行的{{}}块,原正则无法匹配这类内容。
正确的正则写法
推荐使用这个表达式即可满足需求:/{{[^}]*?[0-9a-fA-F]{24}}}/gm
表达式说明:
{{匹配双大括号开头[^}]*?惰性匹配所有非}的字符(包含换行符,天然支持跨换行的{{}}块,同时不会跨多个{{}}块匹配)[0-9a-fA-F]{24}匹配24位十六进制ID}}匹配双大括号结尾,确保24位ID是{{}}块的末尾内容
如果需要更严格的校验(比如ID必须是最后一个|分隔的字段,避免块中间出现24位十六进制的误匹配),可以用更严谨的写法:/{{[^}]*\|[0-9a-fA-F]{24}}}/gm
匹配测试效果
用你提供的示例字符串测试,会命中以下4个符合要求的结果:
{{Syed Waqar Ameen|User|60feab5768e2da001960caf7}}{{Syed Waqar Ameen|User|60feab5768e2da001960caf7}}{{Syed Waqar Ameen|User|60feab5768e2da001960caf7}}{{dsdfsfcvxcvxcv|sdfsdf|60feab5768e2da001960caf7}}
末尾是123的{{Syed Waqar Ameen|User|123}}不会被匹配,完全符合规则要求。
内容的提问来源于stack exchange,提问作者Adil Liaqat
相关产品推荐
相关产品推荐

