4

我正在尝试使用 Perl 和Regexp::GrammarsCPAN 模块从程序中的注释中捕获免费标签。

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
4

1 回答 1

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
于 2013-06-05T09:24:02.153 回答