首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Perl在正则表达式中进行可选匹配?

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

Stack Overflow用户
提问于 2012-12-08 06:43:41
回答 2查看 63关注 0票数 0

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

数据大小:(2000字节)

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

如果字符串存在于文件中,则只显示一次。

到目前为止,我已经:

代码语言:javascript
复制
#!/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“。我认为这是因为文件周围的括号也意味着提取。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-08 06:47:24

您需要$length中的第二次捕获。要做到这一点,你可以

代码语言:javascript
复制
my (undef, $length) = $input =~ /(file)?\s*Data-Size: \((\d+) bytes\)/;

代码语言:javascript
复制
my $length = ( $input =~ /(file)?\s*Data-Size: \((\d+) bytes\)/ )[1];

但是,更好的方法是避免捕获您不感兴趣的内容。

代码语言:javascript
复制
my ($length) = $input =~ /(?:file)?\s*Data-Size: \((\d+) bytes\)/;

当然,你也会得到同样的结果

代码语言:javascript
复制
my ($length) = $input =~ /Data-Size: \((\d+) bytes\)/;

顺便说一下,我删除了不必要的/m/m改变了^$的含义,但在模式中两者都不存在。

票数 4
EN

Stack Overflow用户

发布于 2012-12-09 04:42:44

只要我的2分钱,你可以选择其他方式匹配:

数据大小:((\d+)字节)/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13775222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档