用于从长字符串检索所有JSON的正则表达式
我有一个包含许多JSON的长字符串,它看起来像:用于从长字符串检索所有JSON的正则表达式,json,regex,Json,Regex,我有一个包含许多JSON的长字符串,它看起来像: {"a":"b"}{"c":"d"}{"e":"f"}... 我准备了正则表达式以从该字符串检索所有JSON: \{(?:[^{}]|(?R))*\} 它工作得很好,但有一个问题。如果在需要检索如下字符串时失败: {"a":"b"}{"c":"d"}{"e":"f}"}... 它假定,在“f”字母后面的“}”符号结束第三个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:做得好,很少有人注意到这一点并继续写类似(?)的东西?。