正则表达式,用于验证带有可选变量的JSON映射

时间:2019-05-03 17:38:44

标签: regex

我正在尝试验证从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?"?:?"?(.*?)?"?,? ... \}

如何解决此问题?

1 个答案:

答案 0 :(得分:2)

使用量词指定出现相同图案的时间范围:

\{"[^"]":"[^"]*"(?:,"[^"]+":"[^"]*"){0,12}\}

"[^"]+":"[^"]*"与单个"var":"val"对匹配。我假设您的变量和值将不包含嵌套的双引号(可能有一种方法可以使用lookbehind进行转义的引号,但我不确定如何编写代码)。它至少需要其中之一,然后在它们之间最多允许另外十二个。

但是这样做似乎很脆弱。除了嵌套引号的问题外,我还不允许使用可选的空格,而是假设采用刚性格式。正确的方法是解析JSON,然后测试生成的对象。 JSON解析器支持大多数语言。