我有一个值为
Validation_File_2_3.45.2017.csv
的字符串。
如何使用正则表达式提取第一个数字(在本例中为 2)?
我尝试过表达
($Filedigit) = ($Filename =~ m/^[0-9]/g)
但没有用
在评论中,你说你尝试过这个:
($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
因此,它从字符串的开头开始,丢弃第一组连续数字之前的所有内容,捕获它们并将其放入变量中。
请参阅 perlreftut 和 perlre。
你很接近。使用
^
将匹配锚定到字符串的开头,但第一个数字可能不会出现在该位置。
让正则表达式引擎为您进行搜索并生成最左边的匹配,从而保持代码简单。在英语中,正则表达式匹配
/([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