我有以下字符串(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"}
最佳答案
您的第二个捕获组对于捕获数字信息无效,即 [\((.\d)\)]
这就是什么都没有被捕获的原因。另外,它是 recommended捕获数字时使用 [0-9]
因为 \d
也可以捕获不需要的 unicode 定义的字符。
以下正则表达式将仅捕获 2 个组(与 @revo 的答案不同,后者捕获中间不必要的组)
\{(.[^,\n\]]*)\}(?:\s*\(([0-9]+)\))?
至于第二个要求,正则表达式用于从现有数据中捕获信息,据我所知,不可能注入(inject)不存在的信息。最简单的方法是在运行正则表达式后修复 JSON。
或者,您可以在替换的开头包含一个 0
,这样任何空捕获的值将始终为 0
,并且任何捕获的值仍将是有效的,但只需在开头包含一个 0
,例如04
/035
等
{\"name\":\"$1\", \"count\":\"0$2\"}
关于c# - 正则表达式检索第二个捕获组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28514314/