Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String tcl:从字符串中获取数字的最简单方法?_String_Split_Tcl_Extract - Fatal编程技术网

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

String tcl:从字符串中获取数字的最简单方法?,string,split,tcl,extract,String,Split,Tcl,Extract,大家好,假设我有两个名字:orange12,blue124,red909 ,我想获取索引号,在本例中为:12、124和909。通常,我可以使用“string range first-last”来提取子字符串。要获取第一个和最后一个,我将使用“string len orange”和“string len orange12”。现在我正在寻找另一种方法 相比之下,在python中,我可以执行以下操作: 'orange12'.split('orange')[1] 'blue124'.split('blu

大家好,假设我有两个名字:
orange12,blue124,red909
,我想获取索引号,在本例中为:12、124和909。通常,我可以使用“string range first-last”来提取子字符串。要获取第一个和最后一个,我将使用“string len orange”和“string len orange12”。现在我正在寻找另一种方法

相比之下,在python中,我可以执行以下操作:

'orange12'.split('orange')[1]
'blue124'.split('blue')[1]
'red909'.split('red')[1]
在tcl我怎么能做这样的事情?我在tcl中尝试了“拆分”,但似乎很复杂,无法实现。在tcl中,如何用一个词(而不是字符)拆分


谢谢

这完全取决于您期望的字符串格式

如果是一个已知单词(无数字),例如“橙色”,后跟一些数字,则可以删除该单词:

% string map {orange ""} orange12
12
% string map {blue ""} blue124
124
% string map {red ""} red909
909
如果只知道它是一个后跟数字的单词,您可以尝试使用正则表达式

% regexp {\d+} orange12 index
1
% puts $index
12
无论如何,请注意,数字仍然表示为字符串。如果它以零开头,当转换为数字格式时,它将被解释为八进制,这可能会导致意外的结果

一个选项是通过
扫描

% regexp {\d+} orange012 index
1
% puts $index
012
% expr 1*$index
10
% set index [scan $index %d]
12
% expr 1*$index
12

编辑:使用了Peter的建议之一

这取决于您期望的字符串格式

如果是一个已知单词(无数字),例如“橙色”,后跟一些数字,则可以删除该单词:

% string map {orange ""} orange12
12
% string map {blue ""} blue124
124
% string map {red ""} red909
909
如果只知道它是一个后跟数字的单词,您可以尝试使用正则表达式

% regexp {\d+} orange12 index
1
% puts $index
12
无论如何,请注意数字仍然表示为字符串。如果它以零开头,当转换为数字格式时,它将被解释为八进制,这可能会导致意外的结果

一个选项是通过
扫描

% regexp {\d+} orange012 index
1
% puts $index
012
% expr 1*$index
10
% set index [scan $index %d]
12
% expr 1*$index
12

编辑:有时使用Peter的建议之一,
scan
是最有用的工具。它也经常被忽视:

scan "green012" {%[a-z]%d} word num
# $word is now “green”
# $num is now “12”

有时,
scan
是最有用的工具。它也经常被忽视:

scan "green012" {%[a-z]%d} word num
# $word is now “green”
# $num is now “12”

其他答案向您展示了在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
使用正则表达式而不是字符集来确定拆分字符串参数的位置


文档:,package

其他答案向您展示了解决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
使用正则表达式而不是字符集来确定拆分字符串参数的位置


文档:,包

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

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

在哪里我可以做到这一点,而不必知道“orange”和“orange12”这个词。因此,源名称可以是任意格式的随机名称,如:ANYNAMEanynumber。例如,名称类似于“mywonderfulworld2345612

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

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

在哪里我可以做到这一点,而不必知道“orange”和“orange12”这个词。因此,源名称可以是任意格式的随机名称,如:ANYNAMEanynumber。例如,名称类似于“mywonderfulworld2345612

我忽略了它。是的。。。这比我的regexp reply好这很酷。但我还有更多的问题:如果我需要它,如何在不需要将其存储到“word”和“num”变量的情况下“scan”返回word或num的值。我需要它在我的python脚本中用作在线函数。例如,我想将名称从“orange12”更改为“newname12”。我希望执行如下操作:newname[scan“orange12”{%d}],因此输出应该是:newname12。现在,“scan”命令将返回matches@andio:试试
set name newname[lindex[scan“orange12”{%[a-z]%d}]1]
,或者更好的
set name[string map{orange newname}“orange12”]
@Peter:谢谢。。。所有的剧本都很好:-)@Donal:谢谢你的启示。。。从您的脚本中,我最终提取了如下内容:
newname[scan$name[scan$name{%[a-zA-Z]}]]%d]
。在哪里我可以做到这一点,而不必知道“orange”和“orange12”这个词。因此,源名称可以是任意格式的随机名称,如:ANYNAMEanynumber。例如,像“mywonderfulworld2345612”这样的名称。谢谢guyz的帮助和所有的脚本。我忽略了它。是的。。。这比我的regexp reply好这很酷。但我还有更多的问题:如果我需要它,如何在不需要将其存储到“word”和“num”变量的情况下“scan”返回word或num的值。我需要它在我的python脚本中用作在线函数。例如,我想将名称从“orange12”更改为“newname12”。我希望执行如下操作:newname[scan“orange12”{%d}],因此输出应该是:newname12。现在,“scan”命令将返回matches@andio:试试
set name newname[lindex[scan“orange12”{%[a-z]%d}]1]
,或者更好的
set name[string map{orange newname}“orange12”]
@Peter:谢谢。。。所有的剧本都很好:-)@Donal:谢谢你的启示。。。从您的脚本中,我最终提取了如下内容:
newname[scan$name[scan$name{%[a-zA-Z]}]]%d]
。在哪里我可以做到这一点,而不必知道“orange”和“orange12”这个词。因此,源名称可以是任意格式的随机名称,如:ANYNAMEanynumber。例如,像“mywonderfulworld2345612”这样的名称。谢谢你的帮助和所有的脚本。考虑一下