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

C# 正则表达式检索第二捕获组,c#,regex,json,C#,Regex,Json,我有以下字符串(CrLf可能插入{}和()之外) 我正在尝试将每个项与其组件分离,并使用正则表达式从中创建JSON 输出应该如下所示 {"name":"item1", "count":""}, {"name":"item2", "count":""}, {"name":"item3", "count":""}, {"name":"item4", "count":""}, {"name":"item5", "count":""},{"name":"item6", "count":""} 到目前为

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

我正在尝试将每个项与其组件分离,并使用正则表达式从中创建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}\"}
这是我的

我做错了什么

第二个问题

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


例如,与其将
{item1}
更改为
{“name”:“item1”,“count”:“}
,它应该更改为
{“name”:“item1”,“count”:“0”}

1-您使用的正则表达式的格式不正确。(在字符序列中使用捕获的组
[]

2-在替换模式中不包括第二个捕获的组

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

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

我打算为这个问题提供一个更好的正则表达式

更新:

您的第二个捕获组对于捕获数字信息无效,即
[\(.\d)\)]
,这就是没有捕获任何内容的原因。另外,在捕获数字时,您可以使用
[0-9]
,因为
\d
也可以捕获不需要的unicode定义字符

以下正则表达式将仅捕获这两个组(与@revo的答案不同,后者捕获了中间不必要的组)

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

或者,您可以在替换开始时包含一个
0
,这样任何空捕获的值都将始终为
0
,任何捕获的值仍然有效,但只在开始时包含一个
0
,例如
04
/
035

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

不带正则表达式的解决方案。我尝试使用
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] );
       }

 }

哦我忘了更新regex101(这里有
${2}
问题)。如果第二个捕获组不可用,我假设不可能将
${2}
替换为0?是@BobSort,您必须以编程方式将那些空的
count
键替换为
0
。我也提供了我的正则表达式版本。是的,你的解决方案有效。但与您的工作相同的代码是
Regex.Replace(ItemTooltip,@“\[\[\:([^,\n\]]*)\]\]\\s*(\(((\d)\)?”,“{\“name\”:\“${1}\”,“count\”:“${3}\”)
,这仅仅是一行,如果您知道如何使用Regex,就不必担心单词索引。顺便说一下,如果项目名称中有逗号,则方法将中断,这就是为什么它们被括在花括号中的原因。很好的零解决方案。我没有意识到unicode的情况,但是我的数据是ascii数据,所以我不会担心这一点。不过,我还是选择@revo的解决方案,因为他是第一个,希望你不要介意:-)@BobSort我一点也不介意,但是,只要记住他的答案就可以捕捉到一个额外的不必要的组,这意味着在你的替换中,你需要引用
$1
&
$3
,,mines使用非捕获组只提取名称+值,这意味着您的替换保持原样。
\{(.[^,\n\]]*)\}(?:\s*\(([0-9]+)\))?
{\"name\":\"$1\", \"count\":\"0$2\"}
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] );
       }

 }