【发布时间】:2014-06-30 18:36:43
【问题描述】:
我在这个模式中有一个字符串:
2(some_substring) -> 3(some_other_substring)
现在这些数字可以是任何数字。
我认为answer 可以解决问题。但它在一个变量中给出了所有整数。我希望它们处于不同的变量中,以便我可以分析它们。我们可以拆分它吗?但是拆分会导致问题:
如果数字不是个位数,则拆分错误。
还有其他方法吗?
【问题讨论】:
标签: tcl
我在这个模式中有一个字符串:
2(some_substring) -> 3(some_other_substring)
现在这些数字可以是任何数字。
我认为answer 可以解决问题。但它在一个变量中给出了所有整数。我希望它们处于不同的变量中,以便我可以分析它们。我们可以拆分它吗?但是拆分会导致问题:
如果数字不是个位数,则拆分错误。
还有其他方法吗?
【问题讨论】:
标签: tcl
您可以使用它的变体:您可以将所有数字字符提取到一个列表中,而不是删除非数字字符:
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]+ 匹配至少一个整数。
【讨论】:
set no1 [lindex $numbers 0]set no2 [lindex $numbers 1] 吗?
set他们。谢谢
为了扩展 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
这假设您没有嵌套括号。
【讨论】: