使用正则表达式应用过滤器

问题描述 投票:0回答:3

我正在尝试使用 Perl 中的正则表达式从字符串中提取文本和数字。这是我的代码:

$line = "finish=100\n";
($var) = $line =~ /[a-z]+/;
($val) = $line =~ /[0-9]+/;

我的预期输出是 $var = "finish" 和 $val = 100。但是,当我运行代码时,$var = 1 和 $val = 1。

regex perl
3个回答
4
投票

在正则表达式中使用捕获括号:

$line = "finish=100\n";
($var) = $line =~ /([a-z]+)/;
($val) = $line =~ /([0-9]+)/;
print "$var $val\n";

参考perlre


3
投票

列表上下文中的正则表达式匹配(其中正则表达式不使用

/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"


0
投票

您也可以在一个数组中获取两个值,也许可以这样:

$line = "finish=100\n";
@matches = $line =~ /(\w+)\W(\d+)/;
print "$matches[0], $matches[1]";
© www.soinside.com 2019 - 2024. All rights reserved.