用于查找部分输入是否为有效JSON的正则表达式

问题描述 投票:0回答:1

我有一个需要验证部分输入(请参阅下文)是否为有效JSON的场景?我已引用此answer来确定给定的字符串是否为有效的JSON。

示例输入:

 { 
 "JSON": [{
      "foo":"bar",
      "details": {
           "name":"bar",
           "id":"bar",

到目前为止我尝试过的:

/ (?(DEFINE)
         (?<number>   -? (?= [1-9]|0(?!\d) ) \d+ (\.\d+)? ([eE] [+-]? \d+)? )
         (?<boolean>   true | false | null )
         (?<string>    " ([^"\n\r\t\\\\]* | \\\\ ["\\\\bfnrt\/] | \\\\ u [0-9a-f]{4} )* " )
         (?<array>     \[  (?:  (?&json)  (?: , (?&json)  )*  )?  \s* \]{0,1} )
         (?<pair>      \s* (?&string) \s* : (?&json)  )
         (?<object>    \{  (?:  (?&pair)  (?: , (?&pair)  )*  )?  \s* \}{0,1} )
         (?<json>   \s* (?: (?&number) | (?&boolean) | (?&string) | (?&array) | (?&object) ) \s* )
) \A (?&json)\,{0,1} \Z /six

我使关闭数组和对象成为可选操作(允许零或一次)。但是在某些情况下,这将失败,例如,当您打开一个对象而不关闭另一个对象(如下所示)时,正则表达式仍会找到匹配项。

无效,但仍然匹配:

 { 
 "JSON": [{
      "foo":"bar",
      "details": {
           "name":"bar",
           "id":"bar",{

如何验证部分JSON输入?

json regex pcre
1个回答
0
投票

这不是对您的问题的答案,如果注释形式允许的字符数足够,那么注释的形式就应该是。JSON不是常规语言,因此不能仅由正则表达式引擎识别(如果您使用Python编程,regex程序包提供了扩展,可能使您可以完成任务,但是我所说的通常是正确)。

如果解析器生成器不支持您的首选语言,则可以考虑创建一个简单的递归下降解析器。您已经定义的正则表达式将非常适合您创建令牌,该令牌将成为该解析器的输入。当然,您会期望会发生解析错误-但应该在输入令牌作为文件结束令牌时发生。在扫描文件结束令牌之前发生的分析错误提示您

not

拥有有效JSON的前缀。如果您使用的是自下而上的,减少移位的解析器,例如使用YACC生成的解析器,则这将是文件末尾标记以外的其他内容的移位错误。
© www.soinside.com 2019 - 2024. All rights reserved.