2012-07-14 4 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; 

을,하지만 난 빈 줄에 모든 텍스트를 캡처하고 싶습니다 또는 입력 끝. 누구든지 내가 뭘 잘못하고 있는지 알 수 있니?

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

이 다른 줄 바꿈 다음에 줄 바꿈하지 않은 0 개 이상의 문자와 일치 :

+0

글쎄, 당신이 잘못한 것은''에 줄 바꿈을 포함 할 수 없다는 뜻입니다. 그렇게 명확하지 않은 것은 올바른 해결책입니다. – cjm

+0

@cjm, 예, 좋은 지적입니다. 나는 다른 시도를 보여 줘야했다. 나는. *을 정의하기 위해 을 시도했지만 그 다음 섹션을 포함하여 모든 것을 먹었다. 그래. *? 작동 할 수도 있지만 첫 줄 바꿈에서 중지되었습니다. –

+0

@Jeff 왜냐하면'/ s '를 사용하지 않는 한'.'는'\ n'과 일치하지 않기 때문에'(? s :. *?)'가 아마도 작동 할 것입니다. 아니면. + (? : \ n. +) *'. – Qtax

답변

1

하나의 해결책은 다음과 같이 <text>을 변경하는 것입니다. 그것은 아마도 최선의 해결책은 아니지만 작동합니다.

+0

감사합니다. 나는 앞을 내다 보는 것에 대해 잊어 버렸다. –

관련 문제