用于从长字符串检索所有JSON的正则表达式

用于从长字符串检索所有JSON的正则表达式,json,regex,Json,Regex,我有一个包含许多JSON的长字符串,它看起来像: {"a":"b"}{"c":"d"}{"e":"f"}... 我准备了正则表达式以从该字符串检索所有JSON: \{(?:[^{}]|(?R))*\} 它工作得很好,但有一个问题。如果在需要检索如下字符串时失败: {"a":"b"}{"c":"d"}{"e":"f}"}... 它假定,在“f”字母后面的“}”符号结束第三个JSON,但如果不是这样的话。你们知道我怎么修这个正则表达式吗 代码示例: 谢谢大家! [^{}]不考虑引号之间的部分

我有一个包含许多JSON的长字符串,它看起来像:

{"a":"b"}{"c":"d"}{"e":"f"}...
我准备了正则表达式以从该字符串检索所有JSON:

\{(?:[^{}]|(?R))*\}
它工作得很好,但有一个问题。如果在需要检索如下字符串时失败:

{"a":"b"}{"c":"d"}{"e":"f}"}...
它假定,在“f”字母后面的“}”符号结束第三个JSON,但如果不是这样的话。你们知道我怎么修这个正则表达式吗

代码示例:


谢谢大家!

[^{}]
不考虑引号之间的部分,您可以将其替换为:
[^”{}]|“[^”]*”

您可以使用此模式执行此操作:

{[^"{}]*+(?:"[^"]*+"[^"{}]*+|(?R)[^"{}]*+)*+}

此外,如果要处理引用部分中的转义引号(带反斜杠):

{[^"{}]*+(?:"[^"\\]*+(?s:\\.[^"\\]*)*+"[^"{}]*+|(?R)[^"{}]*+)*+}

这两种模式使用更有效的展开设计。简而言之,你不用写
(A | B)*
,而是写
A*(BA*)*
,只需要更少的步骤

所有格量词
*+
用于防止在字符串中某个位置的花括号不平衡时出现大量回溯。这样,图案在这个位置会很快失效

显然,这两种模式并不完全描述json语法。请随意使用命名组和
(?(定义)…)
功能,这绝非不可能(*)。但您也可以使用第二种模式提取json子字符串,然后使用您选择的json解析器检查它们


(*)类似于:

~
\g<object>

(?(DEFINE)
    (?<string> " [^"\\]*+ (?s: \\. [^"\\]*+ )*+ " )
    (?<table> \[ (?: \s* \g<value> (?: \s* , \s* \g<value> )*+ )? \s* ] )
    (?<object> { 
        (?: \s* \g<key> \s* : \s* \g<value> 
            (?: \s* , \s* \g<key> \s* : \s* \g<value> )*+ 
        )? \s* }
    )
    (?<boolean> [Tt]rue | [Ff]alse )
    (?<number> (?: [0-9]+ (?: \. [0-9]* )? | \.[0-9]+ )
               (?: [Ee] -? [0-9]+ )? )

    (?<key> \g<string> (?<= [^"]" | \\"" ) )
    (?<value> \g<table> | \g<object> | \g<string>
            | \g<number> | \g<boolean> | null )
)
~x
~
\g
(?(定义)
(?“[^”\]*+(?s:\\.[^”\]*+)*+)
(?\[(?:\s*\g(?:\s*,\s*\g)*+)?\s*]
(? { 
(?:\s*\g\s*:\s*\g)
(?:\s*,\s*\g\s*:\s*\g)*+
)?\s*}
)
(?[Tt]阿尔斯街)
(? (?: [0-9]+ (?: \. [0-9]* )? | \.[0-9]+ )
(?:[Ee]-?[0-9]+)?)

(?\g(?
[^{}]
不考虑引号之间的部分,您可以将其替换为:
[^“{}]|“[^”]*”

您可以使用此模式执行此操作:

{[^"{}]*+(?:"[^"]*+"[^"{}]*+|(?R)[^"{}]*+)*+}

此外,如果要处理引用部分中的转义引号(带反斜杠):

{[^"{}]*+(?:"[^"\\]*+(?s:\\.[^"\\]*)*+"[^"{}]*+|(?R)[^"{}]*+)*+}

这两种模式使用了更有效的展开设计。简言之,您不需要编写
(A | B)*
,而是编写需要更少步骤的
A*(BA*)*

所有格量词
*+
用于防止在字符串中某个位置的花括号不平衡时出现大量回溯。这样,该位置的模式将很快失败

显然,这两种模式并没有完全描述json语法。可以使用命名组和
(?(DEFINE)…)
功能进行操作,这绝非不可能(*)。但您也可以使用第二种模式提取json子字符串,然后使用您选择的json解析器检查它们


(*)类似于:

~
\g<object>

(?(DEFINE)
    (?<string> " [^"\\]*+ (?s: \\. [^"\\]*+ )*+ " )
    (?<table> \[ (?: \s* \g<value> (?: \s* , \s* \g<value> )*+ )? \s* ] )
    (?<object> { 
        (?: \s* \g<key> \s* : \s* \g<value> 
            (?: \s* , \s* \g<key> \s* : \s* \g<value> )*+ 
        )? \s* }
    )
    (?<boolean> [Tt]rue | [Ff]alse )
    (?<number> (?: [0-9]+ (?: \. [0-9]* )? | \.[0-9]+ )
               (?: [Ee] -? [0-9]+ )? )

    (?<key> \g<string> (?<= [^"]" | \\"" ) )
    (?<value> \g<table> | \g<object> | \g<string>
            | \g<number> | \g<boolean> | null )
)
~x
~
\g
(?(定义)
(?“[^”\]*+(?s:\\.[^”\]*+)*+)
(?\[(?:\s*\g(?:\s*,\s*\g)*+)?\s*]
(? { 
(?:\s*\g\s*:\s*\g)
(?:\s*,\s*\g\s*:\s*\g)*+
)?\s*}
)
(?[Tt]阿尔斯街)
(? (?: [0-9]+ (?: \. [0-9]* )? | \.[0-9]+ )
(?:[Ee]-?[0-9]+)?)

(?\g(?你只需要比
[^{}]
更精确,并且分别描述引号之间的部分。你只需要比
[^{}]
更精确,并且分别描述引号之间的部分。你太棒了。谢谢你!哈-我一直认为“如果我处理反斜杠引号,我还需要处理反斜杠,等等,无限-这感觉就像一个无尽的兔子洞“-并且完全回避了这个话题。但是你是对的,我只需要始终接受反斜杠后面的第一个字符,不管它是什么。耶!我学到了一件事!”D@DewiMorgan:做得好,很少有人注意到这一点,并继续写类似于
(?)的东西。你太棒了。谢谢你!哈-我一直认为“如果我处理反斜杠引号,我还需要处理反斜杠,等等,无限-这感觉就像一个无尽的兔子洞“-并且完全回避了这个话题。但是你是对的,我只需要始终接受反斜杠后面的第一个字符,不管它是什么。耶!我学到了一件事!”D@DewiMorgan:做得好,很少有人注意到这一点并继续写类似
(?)的东西?。