我正在使用TCL为devcon开发工具。我的问题是我有这种格式的字符串,例如:
USB\VID_16A6&PID_3000\1030FG5295
描述了USB设备ID,我想获得列表:
[USB VID_16A6&PID_3000 1030FG5295]
或以某种方式提取字符串的最后部分(1030FG5295
)。
我尝试使用TCL的字符串并扫描而没有任何成功。你有什么想法吗?
答案 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会有点混淆。 (它用双引号表示突出显示的原因;它实际上并不是必需的。)