Perl匹配括号内的任何内容,将每个实例放入组中

时间:2015-02-18 12:09:08

标签: regex perl

我正试图从Brackets内部抓取任何东西(确保只匹配第一个右括号]

我正在使用

$text=~ /\[(\w+)]/gmi

查找此文件中的所有7个匹配项。

Testing Testing Testing
[Test]
[Test][TestTest][PPPP]
[Test] [TestTest] [PPPP]
Test]

即使设置了多行匹配Test,它也只抓取每行/m的第一个实例。
我试图返回括号内的每个字符串,而不是其他任何东西(例如,没有拾取Test])。

我在正则表达式网络解析器Regex Web Parser中尝试了这个RegEx表达式。其中说它应该返回所有7场比赛。

use strict;
use warnings;
use Win32::OLE;
use Win32::OLE::Enum;
use Win32::OLE qw(in with);
use Win32::OLE::Const;
use Win32::OLE::Const 'Microsoft Word';
use Win32::OLE; $Win32::OLE::Warn = 3;  

my (@req_array,$document,$paragraphs,$paragraph,$enumerate,$style,$text,$word,$oldfile);

    eval {$word = Win32::OLE->GetActiveObject('Word.Application')}; 
    die "Word not installed" if $@; 

    unless (defined $word) { $word = Win32::OLE->new('Word.Application', 

    sub {$_[0]->Quit;}) or die "Oops, cannot start Word"; } 
    $word->Activate; 
    $word->{visible} = 1;

    #$oldfile =~ m!^(.+?)/([^/]+)$!;
    #my $dir = $1 . '/';
    #my $name = $2;
    #$word->ChangeFileOpenDirectory($dir);

    my $doc = $word->Documents->Open('C:\Users\n\Desktop\test.doc');

    print $ARGV[0] . "\n";

    $paragraphs = $doc->Paragraphs();

    $enumerate = new Win32::OLE::Enum($paragraphs);
    while(defined($paragraph = $enumerate->Next()))
    {
        $style = $paragraph->{Style}->{NameLocal};
        $text = $paragraph->{Range}->{Text};
        if($text=~ /\[(\w+)]/gmi)
        {
        print $1 . "\n";
        }

    }

1 个答案:

答案 0 :(得分:3)

如果您捕获正则表达式的一部分,并使用' g' flag - 正如你所做的那样 - 结果是一个数组,而不是一个字符串。

像这样:

#!/usr/bin/perl

use strict;
use warnings;

my @matches;
while ( <DATA> ) {
   push ( @matches, m,\[(\w+)\],g );
}

print join ("\n", @matches );


__DATA__
Testing Testing Testing
[Test]
[Test][TestTest][PPPP]
[Test] [TestTest] [PPPP]
Test]

关于注释中的多行字符串 - 此代码有效, 可以正常使用您的代码。每次运行模式匹配时都会定义$1,并且是第一个捕获组。您可以使用$2等访问其他人

但是,当你正在处理任意数量的可能匹配时,我认为这种匹配方式会失败,这是一个数组适合的地方。

#!/usr/bin/perl

use strict;
use warnings;

my $multi_line_str = q{Testing Testing Testing
[Test]
[Test][TestTest][PPPP]
[Test] [TestTest] [PPPP]
Test]};

print join ("\n", $multi_line_str =~ m,\[(\w+)\],gmi  );
相关问题