如何在其他字符串中找到Json数据?

时间:2018-01-05 14:26:03

标签: javascript json regex

我需要使用JavaScript分析一个字符串,以确定它是否包含一些JSON。

我有一个适用于RegEx 101和PHP的模式:

$pattern = '
/
\{              # { character
(?:         # non-capturing group
        [^{}]   # anything that is not a { or }
        |       # OR
        (?R)    # recurses the entire pattern
    )*          # previous group zero or more times
\}              # } character
/x
';

preg_match_all($pattern, $text, $matches);
print_r($matches[0]);

然而,我正在努力将其转换为JavaScript。以下是我到目前为止的情况:

 var txt = draft.content. // gets a long text string
 jsontest = txt.match(/\{(?:[^{}]|(?R))*\}/xg);

但是这会出现错误:

  

正则表达式中的无效字符(?

有人可以建议对该正则表达式模式进行修改吗?或者是否有其他方法可以在JavaScript中执行此操作而不需要正则表达式?

这是输入:

 New test nested braces

 {
 "employee":{ "name":"John", "age":30, "city":"New York" },
 "location":{"street":"100 Main","City":"Houston","Zip":"77001"}
 }

 And other text that is not part of the string I need 

输出应该是json字符串

4 个答案:

答案 0 :(得分:0)

好的,你的"输入"面值:

New test nested braces

 {
 "employee":{ "name":"John", "age":30, "city":"New York" },
 "location":{"street":"100 Main","City":"Houston","Zip":"77001"}
 }

 And other text that is not part of the string I need 

此正则表达式将匹配您想要的

/{[{}\w\":\s,]*}/g

https://regexr.com/3iqvb

答案 1 :(得分:0)

我找到了另一个解决方案或kludge

 {(?<={).*(?=})}

获取第一个和最后一个花括号及其间的所有内容。

这当然并不意味着匹配的字符串符合JSON并且可以返回

{&#34; a&#34;:&#34; 1&#34;,&#34; b&#34;。&#34; 2&#34;}这里有一些垃圾{&#34; c&# 34;:&#34; 1&#34;&#34; d&#34;&#34; 2&#34;}

作为一个字符串。但我知道我的来源,我相信它会得到复杂的JSON

我更喜欢Liam的解决方案,但绝望的解决方案有时也会起作用。

https://regex101.com/r/DKzfuS/1

答案 2 :(得分:0)

我可以看到我提供的样本非常基本,但@Liam的答案非常适合它,并教会我如何开始。

我找到了一个更强大的JSON示例,包括括号中的数组,电子邮件地址等,所以我将他的解决方案扩展到:

 /{[{}\[\]\w\!@#\$%\^\&*\)\(+=._":@\?\-\s,]*}/g

我寻找更多特殊字符。我意识到它是不完整的,因此需要注意。

https://regex101.com/r/xzgpwe/4

答案 3 :(得分:0)

好的,这里很遗憾。我最初的问题是过度和过度思考。

提供的答案(没有我提供适当的背景)是正确的。

但这更简单,特别是如果您确信JSON之类的字符串已正确生成或可以正确验证。

 {.*}

请参阅此处示例中的测试字符串

https://regex101.com/r/37AUap/1/