2017-02-26 22 views
0

我曾尝试拆分,但仍然失败。如何通过数字拆分字符串

set strdata "34a64323R6662w0332665323020346t534r66662v43037333444533053534a64323R6662w0332665323020346t534r66662v430373334445330535" 

puts [split $strdata "3334445330535"] ;#<---- this command does not work 

The result needed as below: 
{34a64323R6662w0332665323020346t534r66662v43037} {34a64323R6662w0332665323020346t534r66662v43037} 

回答

0

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 mapsplit之间的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"] 
+0

谢谢唐纳德。什么意思是“\ uFFFF”? – Andre

+0

这是一个unicode字符的转义版本,不会出现在普通文本*或*二进制数据中;根据Unicode联盟,我认为它在序列化字符串中并不实际有效。在这里没关系,因为我们暂时借用它作为分裂的标志;它没有别的意思。 –

+0

好的,谢谢你的支持! – Andre

0

split命令不起作用,请参阅文档。

尝试使数据串成一个列表是这样的:

regsub -all 3334445330535 $strdata " " 

即具有空间更换分隔符。

文档: regsubsplit

+1

我们使用tcllib'textutil :: splitx',基本上不会给你推荐什么。 – schlenk