正则表达式Group 1匹配错误:未正确捕获目标内容
搞定正则匹配问题:正确捕获
$body.xxx格式内容 嘿,我来帮你解决这个正则的小坑!你的需求是匹配$body.anyname、$body.anyname.anyname这类格式,但排除末尾带点的$body.anyname.,同时要在Group 1里完整捕获body.anyname这类内容对吧?
先说说你原正则的问题
你写的\$[body]这里踩了个字符类的坑——[body]不是匹配完整的body字符串,而是匹配b、o、d、y这四个字符中的任意一个。所以当你匹配$body.anyname时,[body]实际匹配的是o,剩下的dy.anyname加上这个o就成了ody.anyname,这就是Group 1结果不对的原因。
修正后的正则表达式
直接上能用的正则:
\$(body(\.\w+(\[\d+\])?)*)
逐部分解释下这个正则
\$:匹配字面量的$符号,必须转义否则会被当成正则里的特殊符号(body(\.\w+(\[\d+\])?)*):这就是你要的Group 1,完整捕获从body开始的合法路径body:直接匹配固定的body字符串,不再用字符类,避免匹配单个字符(\.\w+(\[\d+\])?)*:匹配0次或多次的.字段名(或.字段名[下标])结构:\.:匹配点号,必须转义\w+:匹配至少一个字母、数字或下划线,对应你的anyname字段名(\[\d+\])?:可选的数组下标(比如[0]、[123]),\d+允许多位数字,?表示这个下标可以有也可以没有*:表示这个.字段名结构可以重复多次,支持多层嵌套(比如body.user.name)
验证效果
- 能匹配的情况:
$body.anyname→ Group 1 捕获body.anyname$body.anyname.anyname→ Group 1 捕获body.anyname.anyname$body.user[123].email→ Group 1 捕获body.user[123].email
- 不会匹配的情况:
$body.anyname.(末尾带点,正则要求最后必须是字段名或带下标的字段名,无法匹配末尾的孤立点)
如果你的数组下标只允许单个数字,把\d+改成\d就行,灵活调整就好。
内容的提问来源于stack exchange,提问作者richard937
相关产品推荐
相关产品推荐

