我有一个这种模式的字符串:
2(some_substring) -> 3(some_other_substring)
现在这些号码可以是任何东西。
我认为这answer可以解决问题。但它在一个变量中给出了所有整数。我希望它们处于不同的变量中,以便我可以分析它们。我们能分开吗?但拆分会引起问题:
如果数字不是单个数字,则分割将是错误的。
还有其他办法吗?
答案 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
这假设您没有嵌套括号。