Regexp ::语法处理\ n

时间:2017-12-31 13:09:31

标签: perl regexp-grammars

我正在运行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

1 个答案:

答案 0 :(得分:1)

这有效:

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

数据行应由

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

指定。注意:某些Windows文件以新行\n和换行符\r字符结束每一行,因此为[\r\n]+模式。您可以通过perldoc Regexp::Grammars并搜索separator

来详细了解相关信息