正则表达式检索第二个捕获组

时间:2015-02-14 09:43:51

标签: c# regex json

我有以下字符串(CrLf可能会插在{}()之外)

{item1}, {item2} (2), {item3}    (4),  {item4}
(1), {item5},{item6}(5)

我正在尝试将每个项目与其组件分开,并使用正则表达式从中创建JSON。

输出应该如下所示

{"name":"item1", "count":""}, {"name":"item2", "count":""}, {"name":"item3", "count":""}, {"name":"item4", "count":""}, {"name":"item5", "count":""},{"name":"item6", "count":""}

到目前为止,我已关注regex,但它没有捕获第二组。

\{(.[^,\n\]]*)\}\s*[\((.\d)\)]*

我用

替换比赛
{\"name\":\"${1}\", \"count\":\"${2}\"}

这是我的test link

我做错了什么?

第二个问题

是否可以将不计数的项目更改为零,以便我的第二个捕获组读为0?

例如,不应将{item1}更改为{"name":"item1", "count":""},而应更改为{"name":"item1", "count":"0"}

3 个答案:

答案 0 :(得分:2)

您的第二个捕获组无法捕获数字信息,即[\((.\d)\)],这就是为什么没有捕获的原因。此外,它在捕获您使用[0-9]的号码时recommended,因为\d还可以捕获不需要的unicode定义的字符。

以下正则表达式只会捕获2个组(不像@ revo的回答,它会在中间捕获不必要的组)

\{(.[^,\n\]]*)\}(?:\s*\(([0-9]+)\))?

至于第二个要求,正则表达式用于从现有数据中捕获信息,据我所知,它不可能注入已经存在的信息。最简单的方法是在正则表达式运行后修复JSON。

或者,您可以在替换开始时添加0,这样任何空捕获的值始终为0,任何捕获的捕获仍然有效,但只包含一个0一开始就是04 / 035等。

{\"name\":\"$1\", \"count\":\"0$2\"}

答案 1 :(得分:1)

1-您使用的是正则表达式的格式错误的版本。 (使用字符序列[]内的捕获组)

2-您没有在替换模式中包含第二个被捕获的组。

我将您的正则表达式更新为:

\{(.[^,\n\]]*)\}\s*(\((\d*)\))?

Live demo

我将为这个问题提供更好的正则表达式。

更新

{(\w+)}\s*(\((\d+)[),])?

Live demo

答案 2 :(得分:0)

没有regex的解决方案。我尝试使用substring方法从字符串中提取数据,它似乎工作正常

int start, end;

String a = "{item1}, {item2} (2), {item3}    (4),  {item4}(1), {item5},{item6}(5)";

string[] b = a.Split(',');

foreach (String item in b)
{
     Console.WriteLine(item);

     start=item.IndexOf('{') +1 ;
     end = item.IndexOf('}');

     Console.WriteLine(" \t Name : " + item.Substring(start,end-start));

      if (item.IndexOf('(')!=-1 )
      {    
           start = item.IndexOf('(');

           Console.WriteLine(" \t Count : " + item[start+1] );
       }

 }