2

我正在运行幻灯片 15中的示例:

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

针对多行文本运行时:

line_1
line_2

我得到:

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

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

在 Strawberry perl 5.26.1 之上运行 Regexp::Grammers 1.048。

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

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

<rule: text>    .+

真的相当于:

<rule: text><.ws>.+

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

如果您希望忽略规则中的空格(正如您在此处所希望的那样),那么您需要将规则声明为令牌。令牌没有规则的神奇“空白匹配空白”行为。因此你会写:

<token: line> .+

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

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

1 回答 1

1

这有效:

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

数据行应由 EOL 字符分隔

[\r\n]+

指定。注意:一些 Windows 文件以换行符\n和换行符结束每一行,\r因此是[\r\n]+模式。perldoc Regexp::Grammars您可以通过执行 a并搜索来阅读有关此内容的更多信息separator

于 2018-01-03T20:35:19.677 回答