为什么我不能匹配使用/(子模式)可能出现0或1次的子字符串?/

ama*_*jxq 0 regex perl

原始字符串是这样的:

checksession ok:6178 avg:479 avgnet:480 MaxTime:18081 fail1:19

最后一部分" fail1:19 "可能会出现0或1次.我试图匹配" fail1: " 之后的数字,即19,使用这个:

($reg_suc, $reg_fail) = ($1, $2) if $line =~ /^checksession\s+ok:(\d+).*(fail1:(\d+))?/;
Run Code Online (Sandbox Code Playgroud)

它不起作用.即使" fail1:19 "确实存在,$ 2变量也是空的.如果我删除"?",它只有在" fail1:19 "部分存在时才能匹配.$ 2变量将是" fail1:19 ".但如果" fail1:19 "部分不存在,$ 1和$ 2都不匹配.这是不正确的.

如何重写此模式以正确捕获2号码?这意味着当存在" fail1:19 "部分时,将记录两个数字,当它不退出时,仅记录" ok: " 之后的数字.

bvr*_*bvr 6

首先,fail字段中的数字将结束$3,因为这些变量是根据左括号填充的.其次,正如codaddict所示,.*RE中的构造是饥饿的,所以它甚至会吃掉它的fail...部分.第三,你可以避免这样的编号变量:

my $line = "checksession ok:6178 avg:479 avgnet:480 MaxTime:18081 fail1:19";
if(my ($reg_suc, $reg_fail, $addend)
    = $line =~ /^checksession\s+ok:(\d+).*?(fail1:(\d+))?$/
) {
    warn "$reg_suc\n$reg_fail\n$addend\n";
}
Run Code Online (Sandbox Code Playgroud)