c# REGEX 解析包含在组中的新行的内容

c# REGEX parse content with new line included in group

我正在尝试使用 c# 评估遵循此模式的字符串的内容(数字和描述由制表符分隔 - header 不是文本的一部分,只是为了解释 ):

#   description
1   first item
2   second item on two or
    more lines of text
3   third item

我想获得一个匹配列表,其中有一个用于编号的组和一个用于描述的组。我几乎用以下正则表达式实现了它:

(?'number'\d+)(?:\t)(?'description'.+)

这给了我 3 个匹配项,但新行中第二个匹配项的文本总是被丢弃。找不到如何在 description 组中包含多行文本。

您可以使用否定前瞻来断言 .* 之后的内容不是换行符和 1+ 位后跟制表符。

重复 0+ 次匹配整行以将其保留在 description 组中。

(?'number'\d+)\t(?'description'.+(?:\n(?!\d+\t).*)*)

说明

  • (?'number'\d+) 匹配组中的 1+ 个数字 number
  • \t 匹配标签
  • (?'description' 命名捕获组 description
    • .+ 匹配除换行符外的任何字符
    • (?:非捕获组
      • \n(?!\d+\t).* 匹配换行符并断言后面不是 1+ 数字和制表符
    • )*关闭组重复0+次
  • ) 关闭群描述

看到一个.NET regex demo

试试正则表达式:(?'number'\d+)\t(?'description'.+?)(?=^\d|\Z)

Demo