求匹配忽略开头空格后以数字开头的JSON键的正则表达式
匹配忽略开头空格后以数字开头的JSON键的正则方案
需求明确
要定位忽略开头空格后以数字开头的JSON属性名(键),目标是找到符合条件的键的第一个数字,进而选中整个键字符串。
测试用例
- 符合条件的键:
"4WD REGIONAL VALUE PACKAGE " : "42.2 "," 4WD REGIONAL VALUE3 PACKAGE7 " : " 42.2 ","447778WD_REGIONAL_VALUE_PACKAGE2332 " : "42.2 ",
- 不符合条件的键:
" WD_REGIONAL_VALUE_PACKAGE2332 " : "42.2 ",(空格后为字母)"WD_REGIONAL_VALUE_PACKAGE2332 " : "42.2 ",(开头为字母)
原正则的问题
你之前写的(\d(?=[^,"]*[^\d]".*:))存在两个核心问题:
- 没有处理键开头的空格,无法匹配
" 4WD..."这类带前置空格的情况; - 正向预查的逻辑只能定位单个数字,无法关联到整个键的范围,加全局标志后只会零散匹配键内的数字,达不到选中整个键的目的。
正确正则表达式
根据需求,分两种场景给出方案:
1. 捕获符合条件的完整键内容(含前置空格)
这个正则可以直接匹配整个符合要求的键(包括前后引号):
"(\s*\d[^"]*)"\s*:
- 解释:
":匹配键的起始引号;\s*:匹配键开头的任意数量空格(0个或多个);\d[^"]*:匹配空格后的第一个数字,以及数字之后到结束引号前的所有非引号内容;"\s*::匹配键的结束引号、后续空格和冒号,确保这是一个合法的JSON键结构。
2. 单独捕获键的第一个数字,同时保留完整键内容
如果需要单独提取第一个数字,同时保留整个键的内容,可以用分组捕获:
"\s*(\d)([^"]*)"\s*:
- 解释:
- 第一个捕获组
(\d)就是你要找的忽略开头空格后的第一个数字; - 第二个捕获组
([^"]*)是数字之后的键剩余内容; - 整体匹配确保只选中符合条件的JSON键。
- 第一个捕获组
处理HTML转义的引号
如果你的字符串中是HTML转义后的"而非直接的双引号,把正则里的"替换为"即可:
"\s*(\d)([^"]*)"\s*:
使用说明
- 加上全局标志
g,就能一次性匹配所有符合条件的键; - 注意:这个正则适用于无转义引号的常规JSON键场景,如果键内包含转义引号(比如
"test\"key"),需要额外处理转义逻辑,但绝大多数普通JSON场景下足够使用。
内容的提问来源于stack exchange,提问作者VinayakC
相关产品推荐
相关产品推荐

