将字符串拆分为列表

时间:2014-07-16 13:21:48

标签: string list usb tcl

我正在使用TCL为devcon开发工具。我的问题是我有这种格式的字符串,例如:

USB\VID_16A6&PID_3000\1030FG5295

描述了USB设备ID,我想获得列表:

[USB VID_16A6&PID_3000 1030FG5295]

或以某种方式提取字符串的最后部分(1030FG5295)。

我尝试使用TCL的字符串并扫描而没有任何成功。你有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您可以拆分反斜杠并获取结果列表的最后一个元素(split部分提供包含每个部分的列表):

set last_part [lindex [split $input_string {\\}] end]

或使用正则表达式:

regexp -- {[^\\]+$} $input_string last_part

或者由于它几乎采用文件路径格式,因此请使用文件命令:

set last_part [file tail $input_string]

在3个案例中的任何一个案例中,您都会得到一个名为last_part的变量,其中包含1030FG5295

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

答案 1 :(得分:1)

我认为你会发现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来排除\,因为它是一个分隔符,我们将模式放在{括号中{{1而不是}双引号"所以Tcl并不将它解释为元字符。


您还可以使用"(与split很好地配合使用):

lassign

在这里,我给出了一个明确的分隔符,并将反斜杠加倍,否则Tcl会有点混淆。 (它用双引号表示突出显示的原因;它实际上并不是必需的。)