Regexp::Grammars 处理\n

Regexp::Grammars handling \n

我是 运行 来自 slide 15 的示例:

qr{
  <data>
  <rule: data>    <[text]>+
  <rule: text>    .+
}xm;

当 运行 针对多行文本时:

line_1
line_2

我得到:

'text' => [ 'line-1',
            '
            line-2' ]

到目前为止,我还没有成功摆脱捕获的第二行前面的'\n'。

运行 Regexp::Grammers 草莓 perl 5.26.1 之上的 1.048。

更新/澄清 由于(过早 - 抱歉!)提出了针对模块的错误,Damian 澄清如下(回复略微调整以匹配上面的示例):

其中包含空格的规则匹配当时输入中的任何空格(包括换行符)。所以像这样的规则:

<rule: text>    .+

实际上相当于:

<rule: text><.ws>.+

含义:匹配但不捕获任何前导空格,然后匹配除换行符之外的任何字符。

如果您希望规则中的空格被忽略(就像您在这里想要的那样),那么您需要将规则声明为标记。令牌没有规则的神奇 "whitespace-matches-whitespace" 行为。因此你会写:

<token: line> .+

在这种情况下,您还需要明确使用分隔每一行的换行符,例如:

<rule: data> <[line]>+ % \n

这个有效:

qr{
  <data>
  <rule: data>  <[text]>+ % [\r\n]+
  <rule: text>  .+
}xm;

数据行应由

的 EOL 字符分隔
[\r\n]+

指定。注意:一些 Windows 文件在每一行的结尾都有一个新行 \n 和一个换行符 \r,因此是 [\r\n]+ 模式。您可以通过执行 perldoc Regexp::Grammars 并搜索 separator

来阅读更多相关信息