Perl如何为正则表达式匹配结果分配varanble

时间:2015-07-11 17:05:56

标签: regex perl

如何从正则表达式匹配的结果中创建$标量? 有没有办法,一旦脚本匹配正则表达式,它可以分配给一个变量,以便以后可以在块之外使用它。 IE浏览器。如果$regex_result = blah blah然后做某事。 我明白我应该让正则表达式尽可能不贪婪。

#!/usr/bin/perl
use strict;
use warnings;
# use diagnostics;
use Win32::OLE;
use Win32::OLE::Const 'Microsoft Outlook';
my @Qmail;

my $regex = "^\\s\*owner \#";
my $sentence = $regex =~ "/^\\s\*owner \#/";

my $outlook = Win32::OLE->new('Outlook.Application')
    or warn "Failed Opening Outlook.";
my $namespace = $outlook->GetNamespace("MAPI");
my $folder    = $namespace->Folders("test")->Folders("Inbox");
my $items     = $folder->Items;

foreach my $msg ( $items->in ) {
    if ( $msg->{Subject} =~ m/^(.*test alert) / ) {
        my $name = $1;
        print "  processing Email for $name \n";
        push @Qmail, $msg->{Body};
    }
}

for(@Qmail) {
  next unless /$regex|^\s*description/i;
  print; # prints what i want ie lines that start with owner and description
}

print $sentence; # prints ^\\s\*offense \ # not lines that start with owner.

6 个答案:

答案 0 :(得分:2)

一种方法是验证匹配是否发生。

use strict;
use warnings;

my $str = "hello what world";

my $match  = 'no match found';
my $what  = 'no what found';
if ( $str =~ /hello (what) world/ )
{
   $match = $&;
   $what = $1;
}

print '$match = ', $match, "\n";
print '$what = ', $what, "\n";

答案 1 :(得分:0)

正则表达式的匹配存储在特殊变量中(如果指定正则表达式并使用/p标志,则存储在一些更易读的变量中。)

对于整个最后一场比赛,您正在查看$MATCH(或简称为$&)变量。这包含在手册页perlvar中。

所以说你想把你最后一个for循环的匹配存储在一个名为@matches的数组中,你可以编写循环(由于某种原因,我认为你的意思是它是一个foreach循环):

my @matches = ();
foreach (@Qmail) {
    next unless /$regex|^\s*description/i;
    push @matches_in_qmail $MATCH
    print;
}

我认为您的代码存在问题。我不确定最初的意图,但看看这些内容:

my $regex = "^\\s\*owner \#";
my $sentence = $regex =~ "/^\s*owner #/";

我将逐步完成:

  • $regex分配给字符串^\s*owner #
  • $sentence分配给使用正则表达式$regex/^s*owner $/内运行匹配的值(如果$sentence 1Fragment,则不匹配但是因为它不是假的。)

我想。我实际上并不完全确定该行会做什么或者意图做什么。

答案 2 :(得分:0)

我不太确定你想要的比赛的哪一部分:捕捉或其他东西。我写了Regexp::Result,您可以使用它来获取成功匹配的所有捕获等,并Regexp::Flow获取多个结果(包括成功状态)。如果您只想要编号捕获,也可以使用Data::Munge

答案 3 :(得分:0)

您可以执行以下操作:

my $str ="hello world";  
my ($hello, $world) = $str =~ /(hello)|(what)/; 

say "[$_]" for($hello,$world);

如您所见,$ hello包含“hello”。

答案 4 :(得分:0)

使用Perl变量以满足您的要求 -

$`=前一个模式匹配所匹配的字符串之前的字符串,不计算已经退出的嵌套块中匹配的模式。

$&安培; =包含与最后一次模式匹配匹配的字符串

$' =跟随最后一个模式匹配的字符串后面的字符串,不计算已经退出的嵌套块中匹配的模式。例如:

$_ = 'abcdefghi';
/def/; 
print "$`:$&:$'\n";    # prints abc:def:ghi

答案 5 :(得分:0)

如果您的系统上有较旧的perl,例如我,perl 5.18或更早版本,而您使用$ $& $'上面的codequestor答案,则会降低您的程序速度。

相反,您可以将正则表达式模式与修饰符/p一起使用,然后检查这3个变量:${^PREMATCH}${^MATCH}${^POSTMATCH}以获得匹配结果。