我正试图从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";
}
}
答案 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 );