如何标记行,没有列表。例如,对于这样的行:
name name1 name2 name3 3.41 787.0 5.0 8.0
这个正则表达式很有用:
set lst [regexp -all -inline {\S+} $line]
但对于这样的界限:
name1 name2 { name1 name2 name3 }
我想获得3个项目的列表:name1 name2 { name1 name2 name3 }
答案 0 :(得分:1)
该行已经是格式良好的Tcl列表。但是,如果无法保证,您可以使用正则表达式进行提取:
set lst [lrange [regexp -inline {^\s*(\S+)\s+(\S+)\s+\{(.*)\}\s*$} $line] 1 end]
即使你有不平衡的牙箍和其他这样的恶作剧,这也能正常工作。
另一种方法是使用scan
:
set lst [scan $line "%s %s {%\[^{}]}"]
请注意,如果您使用scan
,则只有%[…]
(需要双引号字符串中的反斜杠,如上所述)将读取空格作为扫描说明符的一部分。我通常喜欢写正则表达式,但你不必......