【问题标题】:Regex matching on to extract multi-line text regions (C#)正则表达式匹配以提取多行文本区域(C#)
【发布时间】:2011-02-15 17:58:20
【问题描述】:

我正在寻找以以下格式创建的大文本块中的文本区域:

...
[region:region-name]
multi line
text block
[/region]
...
[region:another-region-name]
more
multi-line text
[/region]

我几乎解决了这个问题

\[region:(?'link'.*)\](?'text'(.|[\r\n])*)\[/region\]

如果我在整个文本中只有一个区域,则此方法有效。但是,当有多个时,这给了我一个块,每个其他“区域”都包含在该块的“文本”中。 我有一种感觉,这是要通过消极的展望来解决的,但是作为一个非正则表达式的非专业人士,我不知道如何修改上述内容以使其正确。 有人可以帮忙吗?

【问题讨论】:

    标签: c# regex multiline negative-lookahead


    【解决方案1】:

    您可以在没有前瞻的情况下执行此操作:

    \[region:(?'link'.*)\](?'text'(?s).*?)\[/region\]
    

    额外的? 使* 量词变得懒惰,因此它将匹配尽可能少的字符。 (?s) 允许点匹配此位置之后的换行符,因此您不必使用 (.|[\r\n]) 构造(替代方案是 [\s\S])。

    【讨论】:

    • 谢谢!这很好用。也感谢你清理我的正则表达式:)
    【解决方案2】:

    您不需要负前瞻,只需将(?'text'(.|[\r\n])*) 更改为“非贪婪”,这样它将匹配[/region] 的第一个实例而不是最后一个。您可以通过在* 之后添加? 来做到这一点,因此生成的模式将是:

    \[region:(?'link'.*)\](?'text'(.|[\r\n])*?)\[/region\]
    

    【讨论】:

    • 谢谢!我在上面使用了蒂姆的建议并没有尝试这个。但是,看起来这也可以。
    猜你喜欢
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 2011-04-08
    • 2010-10-09
    相关资源
    最近更新 更多