在TCL中扫描字符串

时间:2014-03-29 02:41:54

标签: regex tcl

我正在尝试在TCL中操作一个字符串,并希望将字符串中的单个单词分开:

word1+word2+word3+word4;;;;blah;blah

我一直在尝试使用scan来拉出至少word3,并且不介意能够拉出单词1,2和4。我能做的最好的事情就是将所有内容都放到word4变成一个变量,然后重新扫描,我觉得效率非常低。

3 个答案:

答案 0 :(得分:0)

您可以在;上分开,然后在+上分开:

set words [split [split $input ";"] "+"]

这会给你一个包含开头四个单词的列表。如果您正在使用Tcl 8.5:

,则可以使用lassign
lassign $words word1 word2 word3 word4

如果结构总是相同的,也可以使用regexp:

regexp -all -- {([^+]*)\+([^+]*)\+([^+]*)\+ ([^;]*)} $words -> word1 word2 word3 word4

如果您想使用scan,它有点类似:

scan $words {%[^+]+%[^+]+%[^+]+%[^;]} word1 word2 word3 word4

在上述所有内容中,您将获得变量$word1$word2$word3$word4

答案 1 :(得分:0)

根据实际数据的样子,拉出所有由单词字符组成的单词可能就足够了:

set words [regexp -all -inline {\w+} $str]

答案 2 :(得分:0)

scan command非常有能力:

set data "word1+word2+word3+word4;;;;blah;blah"
scan $data {%[^+]+%[^+]+%[^+]+%[^;];;;;%[^;];%[^;]} w1 w2 w3 w4 b1 b2
puts "w1=$w1, w2=$w2, w3=$w3, w4=$w4, b1=$b1, b2=$b2"

诀窍是使用%[^…]来匹配你想要提取的序列,在被否定的匹配集中添加标记你想要的结束的字符。如果您这样做,请确保将模式放在大括号内,以便[字符不会被解释为命令替换。

相关问题