如何标记行,没有列表进入?

时间:2013-12-04 06:53:21

标签: tcl

如何标记行,没有列表。例如,对于这样的行:

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 }

1 个答案:

答案 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,则只有%[…](需要双引号字符串中的反斜杠,如上所述)将读取空格作为扫描说明符的一部分。我通常喜欢写正则表达式,但你不必......