正则匹配成对label-value键值对 跳过无对应value孤立label
正则匹配label-value键值对误配对问题修复
问题根源
初始使用的正则模式:
"label" : "(.*)"[\s\S]*?"value" : "(.*)"
出现跨标签错配的核心原因是:两个键之间的[\s\S]*?惰性匹配逻辑没有做边界限制,匹配过程中允许跨过新出现的label字段,遇到没有对应value的孤立label时,会直接越过该节点向后查找最近的value,最终导致错误配对。
可用修复方案
使用带负向零宽断言的模式限制中间匹配范围,正则写法如下:
"label" : "([^"]*)"(?:(?!label)[\s\S])*?"value" : "([^"]*)"
关键改动说明
- 将原模式中匹配引号内内容的
(.*)替换为([^"]*):从匹配任意字符改为匹配除双引号外的任意字符,从根源避免跨引号匹配的问题,逻辑更严谨 - 将原模式中匹配两键之间内容的
[\s\S]*?替换为(?:(?!label)[\s\S])*?:每匹配一个字符前都会校验当前位置后方没有出现新的label字段,一旦中间碰到新的label节点就会终止当前匹配链路,不会出现跨过孤立label抢占后续value的问题
效果验证
针对包含孤立label的测试文本:
"label" : "Something ?", blabla blabla2 "value" : "NO" blabla "label" : "YouMad ?", blabla "label" : "Foo ?", blabla blabla2 "value" : "Bar"
模式最终返回的正确匹配结果为:
Something ?/NOFoo ?/Bar
无对应value的孤立节点"label" : "YouMad ?"会被自动跳过,不会产生错误配对。
如果需要兼容键名和冒号之间存在任意数量空格、键名使用单引号等宽松JS格式,可以使用适配版本:
["']label["']\s*:\s*["']([^"']*)["'](?:(?!["']label["'])[\s\S])*?["']value["']\s*:\s*["']([^"']*)["']
内容的提问来源于stack exchange,提问作者calandos
相关产品推荐
相关产品推荐

