2012-07-14 44 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