regex C#正则表达式匹配到下一个第一组

jtoj6r0c  于 2023-10-22  发布在  C#
关注(0)|答案(1)|浏览(102)

我在分析一个供应商发来的错误信息。
它看起来像这样

LabelOne: Value 1 LabelTwo: Value 2 : LabelThree: Value 3

结果应该是

[{"LabelOne", "Value 1"}, {"LabelTwo", "Value 2"}, {}, { "LabelThree", "Value 3"} ]

注意空匹配是因为空乱码:在Label2之后,这很好。
这个正则表达式

(\w+):\s+([^:]+ )

但它跳过了最后一个值的3(值而不是值3)
但如果值包含时间戳22:00:36,则会中断,我希望它匹配到下一个标签。有什么想法吗?

dgiusagp

dgiusagp1#

在你的模式中,你使用了一个否定字符类[^:]+,它不能像22:00:36那样交叉匹配冒号。
你可以对下一个空格字符使用Assert,后面跟着一个或多个单词字符和一个冒号:

(\w+):\s+(.*?)(?=\s+\w+:|$)
  • (\w+)捕获组1中的1+个单词字符
  • :按字面匹配
  • \s+匹配1+空格字符
  • (.*?)group 2中捕获尽可能少的字符(非贪婪)
  • (?=\s+\w+:|$)正向前看,Assert1+空格字符,后跟1+单词字符和右边的冒号,或者Assert字符串的结尾

Regex demo
如果您希望至少匹配第2组中的一个单词char,则可以使用(\w.*?),而不仅仅是.*?
另一个选项可以是,例如,将冒号以外的非空白字符与([^\s:].*?)匹配

相关问题