我有以下字符串(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"}
答案 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*)\))?
我将为这个问题提供更好的正则表达式。
{(\w+)}\s*(\((\d+)[),])?
答案 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] );
}
}