我有以下字符串(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\"}
