的split
命令的第二个可选参数被解释为字符集分裂,所以它确实是不会做你想做的。但是,还有其他方法。一个做你想要的东西的简单的方法是在使用string map
于该字符序列转换成字符不输入数据,然后split
:
set strdata "34a64323R6662w0332665323020346t534r66662v43037333444533053534a64323R6662w0332665323020346t534r66662v430373334445330535"
set splitterm "3334445330535"
set items [split [string map [list $splitterm "\uFFFF"] $strdata] "\uFFFF"]
foreach i $items {
puts "==> $i"
}
# ==> 34a64323R6662w0332665323020346t534r66662v43037
# ==> 34a64323R6662w0332665323020346t534r66662v43037
# ==> {}
(Unicode是满的那些!)
请注意,最后有一个{}
(即,一个空字符串列表元素),因为这是在最后一个拆分元素之后出现的字符串。如果你不希望出现这种情况,添加string map
和split
之间的string trimright
:
# Doing this in steps because the line is a bit long otherwise
set mapped [string map [list $splitterm "\uFFFF"] $strdata]
set trimmed [string trimright $mapped "\uFFFF"]
set items [split $trimmed "\uFFFF"]
谢谢唐纳德。什么意思是“\ uFFFF”? – Andre
这是一个unicode字符的转义版本,不会出现在普通文本*或*二进制数据中;根据Unicode联盟,我认为它在序列化字符串中并不实际有效。在这里没关系,因为我们暂时借用它作为分裂的标志;它没有别的意思。 –
好的,谢谢你的支持! – Andre