使用正则表达式截取JSON中的key和value
前几天,一个同事提了一个正则相关的问题:在一个可能多层嵌套的 JSON 里,某些 Field 的 Value 中可能出现 “password=xxxxxxx”这样的模式,如何这个 Value 和它 对应的 Field Name 匹配出来呢?
我们以这个 JSON 为例:
{
"test1": "asdf",
"test2": "2321312312312",
"test_json": {
"test": {
"123": "one two three",
"cookies": "asdfasdf=asdfa\"sdf\"; password=xxxxxx; 123=\"asdfasdf\""
}
},
"abc": 1213
}
折腾了很久,最后用反向预查做出来了。就是长得比较难看,先摆出来:
"((?:(?:[^"])|(?:(?<=\\)"))*)":\s*"((?:(?:(?:[^"])|(?:(?<=\\)"))*)password=(?:(?:(?:[^"])|(?:(?<=\\)"))*))
现在解释一下。主要难点在于 ((?:(?:[^"])|(?:(?<=\)"))*)
这个东西。我匹配的思路是这样的:如果在 Field Name 或者 Field Value 中出现了 "
这个符号,那么它一定是以 \"
这样的形式出现的,所以这部分正则的意思是“匹配一个字符,这个字符要么是非 "
的字符( (?:[^"])
),要么是 前面带有一个 \
的 "
字符( (?:(?<=\)")
);这样的字符出现零次或者无限多次”。
(?:)
的意思是,不要捕获这个括号内的组,这样我们在从匹配结果中通过 group 编号获取数据的时候会方便一些。
其他的部分应该很好理解了,这里不再赘述。最后推荐一个超级厉害的正则表达式工具:https://regex101.com 。感兴趣的朋友可以把本文给出的测试用例和正则表达式粘贴进去试试效果。