我正在尝试使用Perl和Regexp::Grammars
CPAN模块从程序中的注释中捕获免费标记。
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 :(得分: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