如何使用Perl在正则表达式中进行可选匹配?

时间:2012-12-08 06:43:42

标签: regex perl

我想从字符串中提取大小值。字符串可以采用以下两种方式之一进行格式化:

  

数据大小:(2000字节)

  

文件数据大小:(2082字节)

如果字符串存在于文件中,则只会出现一次。

到目前为止,我有:

#!/usr/bin/perl

use strict;
use warnings;

open FILE, "</tmp/test";
my $input = do { local $/; <FILE> };

my ($length) = $input =~ /(file)?\s*Data-Size: \((\d+) bytes\)/m;                   

$length or die "could not get data length\n";
print "length: $length\n";

问题似乎在于使word文件可选。我以为我可以这样做:

  

(文件)?

但是当word文件不存在时,这似乎停止了匹配。此外,当word文件存在时,它将$ length设置为字符串“file”。我认为这是因为文件的括号也意味着提取。

那么如何匹配两个字符串中的任何一个并提取大小值?

2 个答案:

答案 0 :(得分:4)

您希望在$length中进行第二次捕获。为此,您可以使用

my (undef, $length) = $input =~ /(file)?\s*Data-Size: \((\d+) bytes\)/;

my $length = ( $input =~ /(file)?\s*Data-Size: \((\d+) bytes\)/ )[1];

但更好的方法是避免捕捉你不想捕捉的东西。

my ($length) = $input =~ /(?:file)?\s*Data-Size: \((\d+) bytes\)/;

当然,您可以从

获得相同的结果
my ($length) = $input =~ /Data-Size: \((\d+) bytes\)/;

顺便说一句,我删除了不必要的/m/m更改了^$的含义,但模式中都没有。

答案 1 :(得分:0)

只需2美分,您可以通过其他方式进行可选匹配:

/(file |)\ s *数据大小:((\ d +)bytes)/