【问题标题】:How can I parse nested blocks using Regex? [duplicate]如何使用正则表达式解析嵌套块? [复制]
【发布时间】:2011-08-22 17:55:08
【问题描述】:

可能的重复:
RegEx match open tags except XHTML self-contained tags
.NET Regex balancing groups expression - matching when not balanced

例如,如果我有输入:

[quote]他说:
    [quote]我不知道![/quote]
但我不同意![/quote]

还有一句话:

[quote]这里有一些其他的引用。[/quote]

如何使用正则表达式有效地抓取引号块而不抓取太多或太少?例如,如果我使用:

\[Quote\](.+)\[/Quote\]

这会抓住太多(基本上是整个事情),而这个:

\[Quote\](.+?)\[/Quote\]

将抓取太少(它只会抓取[quote]He said:[quote]I have no idea![/quote],开始/结束大括号不匹配)。

那么如何使用 Regex 有效地解析这样的嵌套代码块?

【问题讨论】:

  • 从理论上讲,嵌套模式是不规则的,因此它们不能被正则表达式处理。当然,大多数现代正则表达式实现都可以适应不规则模式,但使用它们仍然很痛苦。
  • 另外,我看到的是 BBCode 吗?见:stackoverflow.com/questions/3788959/…
  • 这不是BBcode,我只是将其用作高级示例。我正在创建的实现是自定义的,看起来不太像 BBcode(尽管这个概念是相同的,因此为了简单起见我使用它的原因)。
  • 请,请,不要。使用解析器或编写一个。见:stackoverflow.com/questions/1732348/…
  • 我会选择合适的解析器,但如果你必须使用正则表达式,请参阅:stackoverflow.com/questions/183846/…

标签: .net regex nested


【解决方案1】:

正则表达式和嵌套不能很好地协同工作。可以构造一个仅匹配 innermost 对的正则表达式(但取决于您使用的正则表达式方言,可能非常麻烦)。但是,如果您想将整个引号与内部的嵌套引号匹配,那么正则表达式根本就不是一个足够强大的工具。您需要研究上下文无关解析器技术,或者在匹配外部引号之前进行连续替换以将嵌套引号重写为其他内容。

【讨论】:

    【解决方案2】:

    看看我的xml indenter,它使用组来匹配开始标签和最后一个标签,另一个组递归获取内容。

    【讨论】:

    • 我讨厌成为那个人,但我真的看不懂。我熟悉 C 风格的语言。
    • 我在代码中添加了一些cmets,希望对您有所帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多