String 将字符串拆分为列表

String 将字符串拆分为列表,string,list,usb,tcl,String,List,Usb,Tcl,我正在使用TCL为devcon开发一个工具。我的问题是,我有一个来自此格式的字符串,例如: USB\VID_16A6&PID_3000\1030FG5295 其中描述了USB设备ID,我想获取以下列表: [USB VID_16A6&PID_3000 1030FG5295] 或者以某种方式提取字符串的最后一部分(1030FG5295) 我尝试使用TCL的字符串和扫描,但没有成功。你有什么想法吗?你可以在反斜杠中拆分,得到结果列表的最后一个元素(拆分部分给出了包含每个部分的列表)

我正在使用TCL为devcon开发一个工具。我的问题是,我有一个来自此格式的字符串,例如:

USB\VID_16A6&PID_3000\1030FG5295
其中描述了USB设备ID,我想获取以下列表:

[USB VID_16A6&PID_3000 1030FG5295]
或者以某种方式提取字符串的最后一部分(
1030FG5295


我尝试使用TCL的字符串和扫描,但没有成功。你有什么想法吗?

你可以在反斜杠中拆分,得到结果列表的最后一个元素(拆分部分给出了包含每个部分的列表):

或者使用正则表达式:

regexp -- {[^\\]+$} $input_string last_part
或者,由于它几乎是文件路径格式,请使用文件命令:

set last_part [file tail $input_string]
在这三种情况中的任何一种情况下,都会得到一个名为
last\u part
的变量,该变量包含
1030FG5295


可能还有其他一些方法(
string range
是我能想到的另一种方法),但我会使用这些方法。

我想你会发现
scan
是一个合适的工具,但你需要正确的模式

set input_string {USB\VID_16A6&PID_3000\1030FG5295}
scan $input_string {%[^\]\%[^\]\%[^\]} a b c
puts "a=$a b=$b c=$c"
# a=USB b=VID_16A6&PID_3000 c=1030FG5295
关键是我们使用
%[^\]
而不是
%s
,来排除
\
,因为它是一个分隔符,我们将模式放在
{
大括号
}
中而不是
双引号
,这样Tcl就不会将其解释为元字符


您还可以使用
split
(这与
lassign
配合得很好):

这里,我给出了一个显式分隔符,并将反斜杠加倍,因为否则Tcl会有点困惑。(为了突出显示原因,它用双引号引起来;实际上没有必要。)

set input_string {USB\VID_16A6&PID_3000\1030FG5295}
scan $input_string {%[^\]\%[^\]\%[^\]} a b c
puts "a=$a b=$b c=$c"
# a=USB b=VID_16A6&PID_3000 c=1030FG5295
lassign [split $input_string "\\"] a b c