Perl 正则表达式检索第一个数字

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

我有一个值为

Validation_File_2_3.45.2017.csv
的字符串。

如何使用正则表达式提取第一个数字(在本例中为 2)?

我尝试过表达

($Filedigit) = ($Filename =~ m/^[0-9]/g)
但没有用

regex perl
2个回答
0
投票

在评论中,你说你尝试过这个:

($Filedigit)= ($Filename =~ m/^[0-9]/g);

有几件事。在继续执行脚本之前,您应该始终检查匹配是否成功,特别是在尝试捕获时。接下来,

^
从字符串的开头查找,然后立即全局查找单个数字
0-9
。除非您有诸如
2_blah.csv
之类的文件名,否则这将不匹配。但是,您实际上并没有尝试捕获任何内容,因此如果您碰巧匹配了某个条目,则在所有情况下
$Filedigit
都将是
1
(表示发生了匹配)。

这是一个可以实现您想要的功能的示例:

use warnings;
use strict;

my $str = 'Validation_File_2_3.45.2017.csv';

# confirm there's a match

if (my ($num) = $str =~ /^.*?(\d+)/){
    print "$num\n";
}
else {
    print "no match\n";
}

正则表达式的解释:

^   - start from beginning of string
.*? - anything, non-greedy
(   - begin capture
\d+ - any number of contiguous digit chars
)   - end capture

因此,它从字符串的开头开始,丢弃第一组连续数字之前的所有内容,捕获它们并将其放入变量中。

请参阅 perlreftutperlre


0
投票

你很接近。使用

^
将匹配锚定到字符串的开头,但第一个数字可能不会出现在该位置。

让正则表达式引擎为您进行搜索并生成最左边的匹配,从而保持代码简单。在英语中,正则表达式匹配

/([0-9])/
的意思是“找到第一个数字并记住它”——正是您想要的。

my $Filename = "Validation_File_2_3.45.2017.csv";

if (my($Filedigit) = $Filename =~ m/([0-9])/) {
  print "$Filename: $Filedigit\n";
}
else {
  print "$Filename: no match.\n";
}

m//
运算符在列表上下文中成功时,它返回与括号中的捕获组匹配的子字符串。在您的示例中,只有一个,并且它落入
$Filedigit
。上面的代码使用
my
声明新的词法变量,以与
use strict
兼容。

输出:

Validation_File_2_3.45.2017.csv: 2
© www.soinside.com 2019 - 2024. All rights reserved.