[英]how to do pattern matching using regular expression of perl in consecutive lines?
[英]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.