【问题标题】:Multiline Regex .Net多行正则表达式.Net
【发布时间】:2014-11-09 15:58:44
【问题描述】:

我目前正在尝试使用 .Net 3.5 中的正则表达式将以下内容提取为段落 每个段落的开头是一个标识短语,表示序列的开头,在本例中为StartMarker。此后,可变数量的行,每行末尾都有一个换行符 (\n)。段落的结尾用空行表示。

输入数据示例如下

StartMarker:
Line1
Line2
Line3
Line4
Line5

StartMarker:
Line6
Line7
Line8

StartMarker:
Line9
Line10

这应该产生以下匹配:

第 1 场比赛

StartMarker:
Line1
Line2
Line3
Line4
Line5

第 2 场比赛

StartMarker:
Line6
Line7
Line8

第 3 场比赛

StartMarker:
Line9
Line10

我试过(^StartMarker.*\n),但它只匹配每个段的第一行。我已经启用了全局和多行选项。

我在想(^StartMarker.*)([\s\S]+\n) 之类的东西,但这不起作用,因为[\s\S]+ 是贪婪的,它会捕获StartMarker 之后的所有内容,直到文件结束。所以我真的不确定如何进行。如有任何帮助,我们将不胜感激。

【问题讨论】:

  • ?+ 之后使它不贪婪。
  • 谢谢。我刚刚试过了。 (^StartMarker:)([\s\S]+?\n)。所以现在它捕获了从 StartMarker: 到下一行末尾的所有内容。关于如何在空行之前捕获它的任何想法?
  • 有了这个不贪婪的位,我想我已经解决了。 ^StartMarker:[\s\S]+?^\n.谢谢你。

标签: .net regex


【解决方案1】:

使用这种模式

(StartMarker:[\s\S]*?)(?=(?:\r?\n)+StartMarker:|$)

Demo

【讨论】:

  • 一开始我还以为这是不对的。但我看到你在 SingleLine 模式下使用它。它也有效!因为我使用的是多行模式,所以以下将起作用 ^StartMarker:[\s\S]+?^\n.对眼睛更轻松。至少对我来说:)。感谢您的帮助。
  • @Dee:那不是单行模式。此正则表达式处于默认模式,其中点 (.) 匹配除换行符以外的任何字符,而锚点(^$)仅匹配整个字符串的开头和结尾。 Singleline 使 . 可以匹配任何内容,而 Multiline 将 ^$ 变成 start-of-lineend-of-line 锚。没有什么能阻止你同时使用这两种模式:(?ms)^StartMarker:.*?(?=(?:\r?\n)+StartMarker:|\Z)
【解决方案2】:

如果您的模式是绝对的,请使用 Regex:

(StartMarker:(?:\sLine\d+)*)

否则,如果您的 Line 可以是任何东西,请使用 Regex:

(StartMarker:(?:\s.+)*)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    相关资源
    最近更新 更多