Perl正则表达式在if语句中[语法]

时间:2011-04-08 10:45:52

标签: regex perl syntax

到目前为止,如果我想将几个正则表达式组合在一起并且if语句中,我就是这样做的:

my $data =...
if ( $data =~ m/regex/ && $data =~ m/secondregex/ ) {...}

是否有快捷方式(我确定有,它的Perl!)以避免重复$ data,例如:

if ( $data =~ m/regex/ && m/secondregex/ ) {..}

...

谢谢,

7 个答案:

答案 0 :(得分:18)

使用默认变量$_,如下所示:

$_ = $data;
if ( m/regex/ && m/secondregex/ ) {..}

因为正则表达式默认作用于$_(与Perl中的许多其他内容一样)。

请确保您不在自动填充$ _的块中,您将需要在此块中稍后使用它。一旦它被覆盖它就消失了。

答案 1 :(得分:14)

for ($data) {
    if (/regex/ && /secondregex/) {...}
}

答案 2 :(得分:7)

只有一行使用智能匹配:

use 5.010;
if ($data ~~ [qr/regex1/,qr/regex2/]) { ... }

答案 3 :(得分:2)

还有一个建议。根据你需要在一个中匹配的正则表列表的长度,如果你需要做这种事情的频率,将它变成一个子程序会很有意义。

灵感来自红宝石的每一个:

sub matchesAll ($@) {
  my $string = shift;
  my $result = 1;
  foreach $_ (@_) {
    $result &&= $string =~ $_;
  }
  $result;
}

然后再做

if (matchesAll $data, $regex1, $regex2, $regex3, $regex4) ...

注意:这需要使用qr // $regex1 = qr/regex1/

编译所有正则表达式以备将来使用

答案 4 :(得分:1)

添加到将$data放入$_的方式列表:

if ( grep { m/regex/ && m/secondregex/ } $data ) {...}

答案 5 :(得分:0)

取决于您的条件结构。您也可以使用嵌套ifs重构一些正则表达式。

即:改变

if (/regex1/ && /regex2/) block1 
elsif (/regex2/ && /regex3/) block2 

if (/regex2/){ 
  if (/regex1/) block1
  else (/regex3/) block2
}

答案 6 :(得分:0)

正确的改变方式

if (/re1/ && /re2/ && /re3/) { ... }

以这种方式进入单一模式:

if (/(?=.*re1)(?=.*re2)(?=.*re3)/s) { ... }