正则表达式解析简单JSON键值对的匹配失败问题求助
解决VBA正则解析JSON简单键值对的问题
你要解析的JSON对象:
{"difficult:name and value with commas":"99,9%;100,00%","b":"very important value","date":"01/01/2023 21:00:00","object members":4}
原正则"([^\[\]\{\}]+)":"*([^\[\]\{\}]+)"*的问题:
- 未处理JSON字符串允许的转义引号(
\"),遇到含转义引号的值会匹配失败; - 未明确区分字符串值与非字符串值的边界,易出现部分匹配或多余捕获;
- 对非字符串值的匹配未严格限制范围,可能误捕获分隔符等无效内容。
符合需求的正则表达式
要匹配排除数组/对象的简单键值对,同时支持带转义引号的字符串值和数字/布尔/null等非字符串值,可用以下正则:
"((?:\\.|[^"\\])+)":(?:("(?:\\.|[^"\\])+")|([^\[\]{},]+))
正则解析
- 键名捕获组(第1组):
"((?:\\.|[^"\\])+)"
匹配带双引号的键名,允许内部包含转义的\",捕获结果为去掉引号的纯键名; - 值部分:
- 字符串值捕获组(第2组):
"(?:\\.|[^"\\])+",匹配带引号的字符串值,支持内部转义引号; - 非字符串值捕获组(第3组):
([^\[\]{},]+),匹配数字、布尔值、null等非数组/对象的简单值,自动排除[、{、}、]、,这些数组/对象或分隔符字符。
- 字符串值捕获组(第2组):
VBA代码示例
Sub ParseJSONKeyValuePairs() Dim jsonStr As String Dim regEx As Object Dim matches As Object Dim match As Object jsonStr = "{""difficult:name and value with commas"":""99,9%;100,00%"",""b"":""very important value"",""date"":""01/01/2023 21:00:00"",""object members"":4}" Set regEx = CreateObject("VBScript.RegExp") With regEx .Pattern = """((?:\\.|[^""\\])+)""\s*:\s*(?:(""(?:\\.|[^""\\])+"")|([^\[\]{},]+))" .Global = True .MultiLine = False End With Set matches = regEx.Execute(jsonStr) For Each match In matches Dim keyName As String Dim valueStr As String keyName = match.SubMatches(0) ' 判断是字符串值还是非字符串值 If match.SubMatches(1) <> "" Then ' 去掉字符串值的首尾引号 valueStr = Mid(match.SubMatches(1), 2, Len(match.SubMatches(1)) - 2) Else valueStr = match.SubMatches(2) End If ' 输出结果到立即窗口 Debug.Print "键: " & keyName & " | 值: " & valueStr Next match End Sub
运行后会在VBA立即窗口输出4组符合预期的键值对。
内容的提问来源于stack exchange,提问作者Mik
相关产品推荐
相关产品推荐

