【问题标题】:c# REGEX parse content with new line included in groupc# REGEX 使用组中包含的新行解析内容
【发布时间】:2019-03-28 14:26:36
【问题描述】:

我正在尝试使用 c# 评估遵循此模式的字符串的内容(数字和描述由制表符分隔 - 标题不是文本的一部分,仅用于说明):

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

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

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

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

【问题讨论】:

  • 作为预处理步骤,用一个空格替换任何换行符后跟一个制表符不是更容易吗?

标签: c# regex regex-group


【解决方案1】:

您可以使用否定的前瞻来断言.* 后面的内容不是换行符和 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

【讨论】:

  • 非常感谢。这就像一个魅力!甚至在数字旁边添加了可选的 '\n' :@"(?'number'\d+(?:\n?)+)\t(?'description'.+(?:\n(?!\d+\ t).*)*)";
【解决方案2】:

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

Demo

【讨论】:

  • 对不起,一旦描述中有数字,就停止工作......
  • @CarlVerret,我已经编辑了帖子以包含修复。
猜你喜欢
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
  • 2017-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多