我正在尝试使用 Perl 中的正则表达式从字符串中提取文本和数字。这是我的代码:
$line = "finish=100\n";
($var) = $line =~ /[a-z]+/;
($val) = $line =~ /[0-9]+/;
我的预期输出是 $var = "finish" 和 $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
如果成功并且模式没有捕获任何内容您的正则表达式匹配,但它们不包含任何捕获组,因此这就是您在
1
和 $var
中获得 $val
的原因。
如果添加捕获组(
/([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]";