2017-02-26 3 views
0

私は分裂していましたが、まだ失敗しました。数字で文字列を分割する方法

set strdata "34a64323R6662w0332665323020346t534r66662v43037333444533053534a64323R6662w0332665323020346t534r66662v430373334445330535" 

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

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

答えて

0

splitコマンドのオプションの第二引数ががオンに分割する文字のを設定すると解釈されるので、本当にあなたがやりたいことするつもりはありません。しかし、他のアプローチがあります。あなたが欲しいものを行うための単純な方法の一つは、(!Unicodeはそれらの完全である)入力データにない文字に文字列を変換する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 
# ==> {} 

{}(つまり、空の文字列のリスト要素)が最後の分割要素の後に来る文字列であるため、末尾にあることに注意してください。基本的にはお勧めは何textutil :: splitx`

# 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 Consortiumによると、実際にはシリアル化された文字列では有効ではないと思います。それは私たちが分割する場所のマーカーとして一時的に借りているだけなので、ここでOKです。それは何も意味しない。 –

+0

よろしくお願い申し上げます。 – Andre

0

splitコマンドは、そのように機能しません。マニュアルを参照してください。

regsub -all 3334445330535 $strdata " " 

は、すなわちスペースで区切り文字を置き換える:

は、このようなリストにデータ列を作ってみましょう。

ドキュメント: regsubsplit

+1

当社の利用tcllib '、:あなたがいることをしたくない場合は、string trimrightstring mapsplit間を追加します。 – schlenk

関連する問題