嗨,我想说我有几个名字:orange12 , blue124 , red909
,我想获取索引号,在这种情况下:12,124和909.通常,我可以使用'字符串范围,最后一个'提取子字符串。并获得第一个和最后一个我将使用'字符串len orange'和'字符串len orange12'。现在,我正在寻找另一种方法。
作为比较,在python中,我可以做类似的事情:
'orange12'.split('orange')[1]
'blue124'.split('blue')[1]
'red909'.split('red')[1]
我怎样才能在tcl中做类似的事情?我试过了'分裂'在tcl,但似乎很复杂,无法使它工作。在tcl中我怎么能用一个单词(而不是字符)分开?
由于
答案 0 :(得分:6)
有时,scan
是最实用的工具。它也经常被忽视:
scan "green012" {%[a-z]%d} word num
# $word is now “green”
# $num is now “12”
答案 1 :(得分:2)
这取决于您期望的字符串格式。
如果是已知单词(没有数字),例如' orange',后跟一些数字,您可以删除单词:
% string map {orange ""} orange12
12
% string map {blue ""} blue124
124
% string map {red ""} red909
909
如果仅知道它是一个后跟数字的单词,您可以尝试使用正则表达式。
% regexp {\d+} orange12 index
1
% puts $index
12
无论如何,请注意,数字仍然表示为字符串。如果它以零开头,则在转换为数字格式时将被解释为八进制,这可能会导致意外结果。
一种选择是将其传递给scan
:
% regexp {\d+} orange012 index
1
% puts $index
012
% expr 1*$index
10
% set index [scan $index %d]
12
% expr 1*$index
12
编辑:使用彼得的一个建议
答案 2 :(得分:1)
其他答案向您展示了在Tcl中解决问题的最佳方法,但回答您提出的问题,这里是Tcl中的等效代码:
package require textutil
lindex [textutil::splitx orange12 orange] 1
lindex [textutil::splitx blue124 blue] 1
lindex [textutil::splitx red909 red] 1
textutil
包是Tcl伴随库Tcllib
的一部分。 splitx
命令是核心命令split
的扩展替换:splitx
采用正则表达式而不是字符集来确定将字符串参数拆分的位置。
答案 3 :(得分:0)
我终于找到了自己问题的最佳答案,我想在这里分享一下:
set name orange12345
[scan $name [scan $name {%[a-zA-Z]}]%d ]
#12345
我可以做到这一点,而不必知道“橘子”这个词。来自' orange12' 。所以源名称可以是任何随机名称,格式如下: ANYNAMEanynumber 。例如,名称如' mywonderfulworld2345612 '。