tcl:从字符串中获取数字的最简单方法是什么?

时间:2016-03-26 19:17:00

标签: string split tcl extract

嗨,我想说我有几个名字: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中我怎么能用一个单词(而不是字符)分开?

由于

4 个答案:

答案 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采用正则表达式而不是字符集来确定将字符串参数拆分的位置。

文档:lindextextutil

答案 3 :(得分:0)

我终于找到了自己问题的最佳答案,我想在这里分享一下:

set name orange12345
[scan $name [scan $name {%[a-zA-Z]}]%d ] 
#12345

我可以做到这一点,而不必知道“橘子”这个词。来自' orange12' 。所以源名称可以是任何随机名称,格式如下: ANYNAMEanynumber 。例如,名称如' mywonderfulworld2345612 '。