我正在尝试验证从Web服务调用获得的JSON响应。
在这样的映射中,总共有13个变量可能会也可能不会被传回:
{"var1":"val1","var2":"val2","var3":"val3", ... "var13":"val13"}
最长的响应可能包含所有13个变量,但是典型的响应更像这样:
{"var4":"val4","var6":"val6","var10","val10"}
我需要编写可捕获值的正则表达式,以便可以将它们设置为接收系统中的各个变量。
可选的非捕获组,可选的捕获组,使每个字符都可选
如果所有13个变量都出现在每个API响应中,则以下正则表达式将完美运行:
\{"var1":"?(.*?)"?,"var2":"?(.*?)"?,"var3":"?(.*?)"?,"var4":"?(.*?)"?,"var5":"?(.*?)"?,"var6":"?(.*?)"?,"var7":"?(.*?)"?,"var8":"?(.*?)"?,"var9":"?(.*?)"?,"var10":"?(.*?)"?,"var11":"?(.*?)"?,"var12":"?(.*?)"?,"var13":"?(.*?)"?\}
我尝试了很多不同的组合,例如将变量包装在可选的非捕获组中,例如:
\{(:?"var1":)?"?(.*?)"?,? ... \}
并使捕获组本身也是可选的:
\{(:?"var1":)?"?(.*?)?"?,? ... \}
使每个字符都是可选的:
\{"?v?a?r?1?"?:?"?(.*?)?"?,? ... \}
如何解决此问题?
答案 0 :(得分:2)
使用量词指定出现相同图案的时间范围:
\{"[^"]":"[^"]*"(?:,"[^"]+":"[^"]*"){0,12}\}
"[^"]+":"[^"]*"
与单个"var":"val"
对匹配。我假设您的变量和值将不包含嵌套的双引号(可能有一种方法可以使用lookbehind进行转义的引号,但我不确定如何编写代码)。它至少需要其中之一,然后在它们之间最多允许另外十二个。
但是这样做似乎很脆弱。除了嵌套引号的问题外,我还不允许使用可选的空格,而是假设采用刚性格式。正确的方法是解析JSON,然后测试生成的对象。 JSON解析器支持大多数语言。