使用正则表达式提取字符串日期时输出为1的问题求助
问题分析与解决
你遇到的问题是因为Perl中=~在标量上下文(直接赋值给单个变量)时,返回的是匹配成功的布尔值(1表示匹配成功,空表示失败),而非匹配到的字符串内容,所以输出1。
修正方案
方案1:使用捕获组结合条件判断
通过在正则表达式中给日期部分加上括号(捕获组),匹配成功后通过$1获取捕获到的日期内容:
my $string = 'Job-2023-04-14.17.14.34'; if ($string =~ /(\d{4}-\d{2}-\d{2})/) { print "$1\n"; # 输出 2023-04-14 } else { print "The string does not contain a valid date.\n"; }
方案2:列表上下文赋值
将匹配结果赋值给列表(即使是单个元素的列表),Perl会在列表上下文下返回捕获组的内容,匹配失败时变量会被设为undef:
my $string = 'Job-2023-04-14.17.14.34'; my ($date) = $string =~ /(\d{4}-\d{2}-\d{2})/; if (defined $date) { print "$date\n"; # 输出 2023-04-14 } else { print "The string does not contain a valid date.\n"; }
注意:不建议使用$&变量(它会保存最后一次匹配的完整字符串),因为该变量会强制Perl为所有正则表达式保存匹配内容,影响程序性能。
内容的提问来源于stack exchange,提问作者Nikita Amlani
相关产品推荐
相关产品推荐

