2012-07-14 45 views
3

我是Regexp :: Grammars的新手,很难匹配多线模式。我有这个输入:如何使用Regexp :: Grammars匹配多行模式?

my $text = <<EOD; 
HEADER: 
This is a multi-line section, because the 
second line is down here. 

EOD 

这个语法:

use Regexp::Grammars; 
my $parser = qr{ 
    <nocontext:> 
    <doc> 
    <rule: doc>   <[section]>+ 
    <rule: section>  <label> : <text> (\n\n | $) 
    <token: label>  [A-Z0-9_&/ -]+ 
    <token: text>   [^\n]* 
}xms; 

我只匹配部分的第一线,但我想捕获所有文字到一个空行或输入结束。任何人都可以看到我做错了什么?

+0

那么,你做错了什么是告诉它''不能包含换行符,所以它不。不太明显的是正确的解决方案。 – cjm 2012-07-14 18:11:45

+0

@cjm,是的,好点。我应该显示我的其他尝试。我曾尝试将定义为。*,但已经吃掉了所有内容,包括后续章节。我虽然。*?可能会工作,但停在第一个换行符。 – 2012-07-14 18:21:05

+0

@Jeff,因为'.'与'\ n'不匹配,除非你使用'/ s',所以'(?s:。*?)'可能会起作用。或者'。+(?:\ n。+)*'。 – Qtax 2012-07-14 19:22:53

回答

1

一种解决方案是改变<text>如下:

<token: text>   (?:(?!\n\n).)* 

此0或多个字符不属于新行后跟另一个换行匹配。这可能不是最好的解决方案,但它有效。

+0

谢谢,这很好!我已经忘记了预见。 – 2012-07-14 22:03:00