【问题标题】:How do I match a multiline pattern using Regexp::Grammars?如何使用 Regexp::Grammars 匹配多行模式?
【发布时间】:2012-07-14 03:35:54
【问题描述】:

我是 Regexp::Grammars 的新手,在匹配多行模式时遇到了问题。我有这个输入:

my $text = <<EOD;
HEADER:
This is a multi-line section, because the
second line is down here.

EOD

还有这个语法:

use Regexp::Grammars;
my $parser = qr{
  <nocontext:>
  <doc>
  <rule: doc>           <[section]>+
  <rule: section>       <label> : <text> (\n\n | $)
  <token: label>        [A-Z0-9_&/ -]+
  <token: text>         [^\n]*
}xms;

我只匹配该部分的第一行,但我想捕获所有文本,直到空白行或输入结束。谁能看到我做错了什么?

【问题讨论】:

  • 好吧,你做错了告诉它&lt;text&gt; 不能包含换行符,所以它不包含。不那么明显的是正确的解决方案。
  • @cjm,是的,好点。我应该展示我的其他尝试。我曾尝试将 定义为 .*,但这吞噬了所有内容,包括后续部分。我虽然.*?可能有效,但在第一个换行符处停止。
  • @Jeff,因为. 不匹配\n,除非你使用/s,所以(?s:.*?) 可能会起作用。或者.+(?:\n.+)*.

标签: regex perl grammar regexp-grammars


【解决方案1】:

一种解决方案是将&lt;text&gt;更改如下:

<token: text>         (?:(?!\n\n).)*

这匹配 0 个或多个不是换行符后跟另一个换行符的字符。这可能不是最好的解决方案,但它确实有效。

【讨论】:

  • 谢谢,效果很好!我忘记了前瞻。
猜你喜欢
  • 1970-01-01
  • 2019-09-23
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
相关资源
最近更新 更多