使用正则表达式在Perl中应用过滤器
问题描述:
我试图在perl中使用正则表达式从字符串中提取文本和数字。这里是我的代码:使用正则表达式在Perl中应用过滤器
$line = "finish=100\n";
($var) = $line =~ /[a-z]+/;
($val) = $line =~ /[0-9]+/;
我预期的输出是$ VAR = “完成” 和$ VAL = 100。然而,当我运行的代码是$ var = 1和$ VAL = 1
任何帮助将不胜感激!
答
使用捕捉你的正则表达式括号内:
$line = "finish=100\n";
($var) = $line =~ /([a-z]+)/;
($val) = $line =~ /([0-9]+)/;
print "$var $val\n";
参考perlre
答
一个正则表达式匹配在列表环境(其中正则表达式不使用/g
标志)返回
- 空列表如果失败
- 捕获的子字符串列表(
$1, $2, ...
),如果它成功和模式包含捕获组 - 列表
1
如果成功和模式没有捕获任何
你的正则表达式匹配,但它们不包含任何捕获组,所以这是为什么你在$var
和$val
得到1
。
如果添加捕获组(/([a-z]+)/
,/([0-9]+)/
),则会得到匹配的子字符串。
注意,这可能是更容易只是做这一切在一次比赛:
my ($var, $val) = $line =~ /^([a-z]+)=([0-9]+)$/;
这样你也验证输入字符串具有预期的形式,而不是仅仅像"Cat o' 9 tails"
,其中(与您的原始正则表达式)将提取$var = "at"
和$val = "9"
。
答
你也能得到一个阵列的两个值,可能与此:
$line = "finish=100\n";
@matches = $line =~ /(\w+)\W(\d+)/;
print "$matches[0], $matches[1]";