使用正则表达式在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]";