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
来阅读更多相关信息
我是 运行 来自 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