Skip to main content
 首页 » 编程设计

c#之正则表达式检索第二个捕获组

2024年08月06日38grandyang

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