Tcl regexp:为什么' +'尽可能不匹配?

时间:2015-12-11 11:10:30

标签: regex tcl

我正在使用TCL8.4。在下面的表达式中,我尝试使用([0-9] +)获取数值。但是,尽管手册页显示了' +'用于尽可能多的匹配(参考:http://wiki.tcl.tk/396) 另外,请分享/建议任何更好的方式来做我想做的事。

%set a {
NOTPLD STATS:
              Bps:                    0; pps:                    0; Bytes:                    0; Packets:                    4535

TPLD STATS:
          Bps:                    0; pps:                    0; Bytes:                    0; Packets:                    4535

}
%
% regexp {NOTPLD STATS:(.*?)Packets:[\s]+([0-9]+)} $a t1 t2 c 
1
% set c
4

1 个答案:

答案 0 :(得分:4)

请参阅Interaction Between Quantifiers with Different Greediness

  

分支中的所有量词都转换为相同的贪心,因此添加非贪婪的量词会使分支中的其他量词也隐含非贪婪。

因此,您的([0-9]+)被解释为([0-9]+?),并且它与一个或多个数字匹配,但尽可能少地返回有效匹配。 模式结尾处的所有延迟子模式仅匹配零(*?)或一个(+?)符号。

一个简单的解决方案就是添加一个尾随字符,这里是一个换行符(或空格):

regexp {NOTPLD STATS:(.*?)Packets:[\s]+([0-9]+)\s} $a t1 t2 c
                                                ^

请参阅IDEONE demo

如果值可以在字符串的末尾,请使用替换(?:\s|$)