从TCL中的字符串中提取整数

时间:2014-06-30 09:56:40

标签: tcl

我有一个这种模式的字符串:

2(some_substring) -> 3(some_other_substring)

现在这些号码可以是任何东西。

我认为这answer可以解决问题。但它在一个变量中给出了所有整数。我希望它们处于不同的变量中,以便我可以分析它们。我们能分开吗?但拆分会引起问题:

如果数字不是单个数字,则分割将是错误的。

还有其他办法吗?

2 个答案:

答案 0 :(得分:4)

您可以使用以下变体:您可以将所有数字字符提取到列表中,而不是删除非数字字符:

set text {2(some_substring) -> 3(some_other_substring)}
set numbers [regexp -all -inline -- {[0-9]+} $text]
puts $numbers
# => 2 3

要获取每个号码,您可以使用lindex

puts [lindex $numbers 0]
# => 2

或者在8.5及更高版本中,您可以使用lassign将它们分配给特定的变量名称:

lassign $numbers first second
puts $first
# => 2
puts $second
# => 3

regexp -all -inline -- {[0-9]+} $text中,-all提取所有匹配项,-inline将匹配项放入列表中,--结束选项,[0-9]+匹配至少一项整数。

答案 1 :(得分:1)

为了扩展Jerry的答案,如果数字可以出现在括号内,正则表达式只提取紧跟在左括号后面的数字:{\d+(=\()}

% set text {2(some_6substring) -> 3(some_other_5substring)}
2(some_6substring) -> 3(some_other_5substring)
% lassign [regexp -all -inline {\d+(?=\()} $text] first second
% set first
2
% set second
3

这假设您没有嵌套括号。