我正在使用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
答案 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|$)
。