繁体   English   中英

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

[英]How do I do optional matching in a regular expression using 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文件成为可选文件。 我以为我可以这样做:

(文件)?

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

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

您想要$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更改^$的含义,但是模式中都不存在。

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

/(文件|)\\ s *数据大小:((\\ d +)字节)/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM