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] );
}
}