我正在运行slide 15中的示例:
qr{
<data>
<rule: data> <[text]>+
<rule: text> .+
}xm;
针对多行文字运行时:
line_1
line_2
我明白了:
'text' => [ 'line-1',
'
line-2' ]
到目前为止,我还没有成功摆脱&#39; \ n&#39;在第二条线前捕获。
在Strawberry perl 5.26.1上运行Regexp :: Grammers 1.048。
更新/澄清 有(早熟 - 抱歉!)提出了一个针对该模块的错误,Damian澄清如下(回复略微适应上述例子):
其中包含空格的规则匹配该点输入中的任何空格(包括换行符)。所以像这样的规则:
<rule: text> .+
实际上相当于:
<rule: text><.ws>.+
含义:匹配但不要捕获任何前导空格,然后匹配任何字符 - 除了换行符。
如果您希望忽略规则中的空格(您似乎想要这里),那么您需要将规则声明为令牌。代币不具备神奇的空白匹配空白&#34;规则的行为。因此你会写:
<token: line> .+
在这种情况下,您还需要显式使用分隔每一行的换行符,例如:
<rule: data> <[line]>+ % \n
答案 0 :(得分:1)
这有效:
qr{
<data>
<rule: data> <[text]>+ % [\r\n]+
<rule: text> .+
}xm;
数据行应由
的EOL字符分隔[\r\n]+
指定。注意:某些Windows文件以新行\n
和换行符\r
字符结束每一行,因此为[\r\n]+
模式。您可以通过perldoc Regexp::Grammars
并搜索separator