正则表达式捕获特殊字符之间的所有内容

时间:2017-10-13 07:21:03

标签: regex perl

我需要在perl中捕获{和}之间的所有内容,{in a string。出现次数可以从0到有限数。

我试图使用:

my @tmp;
my $extract = "";                   
$extract = $1 if $json =~ /\{([^}]+)\}/g;
push @tmp, $extract;

其中$ json是我需要提取内容的字符串。

以下是两个 $ json 项目的示例:

  

{" ID":" AAAAAAAAAA""文本":" AAAAAAAAAA""图标":& #34; jstree文件夹"" li_attr" {" ID":" AAAAAAAAAA"}" a_attr":{& #34; HREF":"#"" ID":" AAAAAAAAAA_anchor"}"状态" {&#34 ;装载":真,"开":真,"选择":假,"禁用":假}"数据" :{" Taginfo":"默认""类型":"""测量":&#34 ;""刻度":"默认""过滤器":"""概念" :"默认"" USO":"默认"" Uso2":"默认"" Parciales":1},"父":"#"},{" ID":" BBBBBBBBBBBBB"&#34 ;文本":" BBBBBBBBBBBBB""图标":" jstree文件夹"" li_attr" {" ID& #34;:" BBBBBBBBBBBBB"}" a_attr" {" HREF":" AAAAAAAAAA"" ID" :" BBBBBBBBBBBBB_anchor"}"状态" {"装载":真, "开":假,"选择":真,"禁用":假}"数据" {" Taginfo&# 34;:" BBBBBBBBBBBBB""类型":"默认""测量":"默认"&# 34;刻度":" 1000""过滤器":" 1000""概念":"默认&#34 ;," USO":""" Uso2":""" Parciales":1}, "父":" AAAAAAAAAA"}

使用上面的正则表达式,我没有得到正确的字符串。即:第一次出现时必须是:

  

{" ID":" AAAAAAAAAA""文本":" AAAAAAAAAA""图标":& #34; jstree文件夹"" li_attr" {" ID":" AAAAAAAAAA"}" a_attr":{& #34; HREF":"#"" ID":" AAAAAAAAAA_anchor"}"状态" {&#34 ;装载":真,"开":真,"选择":假,"禁用":假}"数据" :{" Taginfo":"默认""类型":"""测量":&#34 ;""刻度":"默认""过滤器":"""概念" :"默认"" USO":"默认"" Uso2":"默认"" Parciales":1},"父":"#"}

所以,我需要捕捉到下一个:

},{

我的问题是如何忽略使用}结束捕获组,{而不仅仅是}?

感谢。

1 个答案:

答案 0 :(得分:2)

您实际上需要使用递归匹配模式来匹配结束{ .. },如下所示:

\{(?:[^{}]+|(?0))*}

RegEx Demo

这里(?0)递归整个模式。

虽然如果要解析有效的JSON字符串,那么最好使用JSON解析器。

相关问题