2013-06-04 2 views
4

Я пытаюсь захватить бесплатные теги из комментариев в программе с помощью Perl и модуля CPAN Regexp::Grammars.Разбор тегов из файла с регулярным выражением :: Grammars

use strict; 
use v5.10; 
use YAML; 

my $s = q{ 
     junk code; 
     // here be tags #:tag1: 
     junk code 2; 
     // another one #:tag2: 
     junk ...; 
}; 

my $rg = do { 
    use Regexp::Grammars; 
    qr{ 
     <nocontext: > 
     ^.* <Tagger> .* $ 
     <rule: Tagger>   <[MATCH=single_tag]> + 
     <token: single_tag> \#\:<tag>\: 
     <token: tag>   <matchline> \w+ 
    }xms; 
}; 

if($s =~ $rg) { 
    say Dump(\%/);  
} else { 
    say 'no match'; 
} 

Но выход показывает YAML я только захватывая последний тег:

--- 
Tagger: 
    - tag: 
     matchline: 5 

Как я могу соответствовать все теги входных данных вместо?

И ... как я могу получить строку тега соответствует без включения шумных контекстных строк (снимающих nocontext: директиву), так что конечный результат несколько более читаемым, то есть:

--- 
Tagger: 
    - tag: tag1 
    matchline: 3 
    - tag: tag2 
    matchline: 5 

ответ

0

Нашел :

my $rg = do { 
    use Regexp::Grammars; 
    qr{ 
     <nocontext: > 

     <Tagger> 
     <rule: Tagger>   <[MATCH=single_tag]>+ % (.*) 
     <token: single_tag> <matchline> \#\:<tag>\: 
     <token: tag>   \w+ 
    }xms; 
}; 

Который дает следующее YAML:

--- 
Tagger: 
    - matchline: 3 
    tag: tag1 
    - matchline: 5 
    tag: tag2 
Смежные вопросы