如何用正则从JSON值中仅提取前N个字符?
解决正则提取JSON值前N个字符时的分隔符干扰问题
问题根源
你之前的正则针对带引号的字符串用[^"]匹配是有效的,但数字类型的值没有引号包裹,[^"]会把值后面的逗号也纳入匹配范围(因为逗号不属于引号),导致单字符数字值会带出逗号。
解决方案
1. 通用匹配正则(兼容字符串/数字类型)
直接匹配值的有效内容,排除逗号、右大括号、引号这些分隔符,同时限制取前N个字符(以N=2为例):
"目标键名":\s*(?<test>[^,\}"]{1,2})
- 示例:
- 提取
sourceDisk前2个字符:"sourceDisk":\s*(?<test>[^,\}"]{1,2})→ 匹配结果in - 提取
testNumber1前2个字符:"testNumber1":\s*(?<test>[^,\}"]{1,2})→ 匹配结果33 - 提取
testNumber3前2个字符:"testNumber3":\s*(?<test>[^,\}"]{1,2})→ 匹配结果3
- 提取
2. 分类型精准匹配
如果能明确值的类型,可针对性写正则:
- 字符串类型(带引号):
只匹配引号内的内容,不会触及外部符号。"目标键名":\s*"(?<test>[^"]{1,2}) - 数字类型(无引号):
仅匹配数字字符,自动排除后面的逗号。"目标键名":\s*(?<test>\d{1,2})
3. 捕获完整值后再截取
如果允许后续处理,可先捕获完整的有效值,再截取前N个字符:
"目标键名":\s*(?:"(?<str_val>[^"]+)"|(?<num_val>\d+))
- 字符串值会被捕获到
str_val组,数字值到num_val组,之后从对应组的结果中截取前N个字符即可。
内容的提问来源于stack exchange,提问作者Jyothi Sony
相关产品推荐
相关产品推荐

