web-dev-qa-db-ja.com

tclの文字列から部分文字列を切り取るにはどうすればよいですか?

NYMEX UTBPIのような文字列があります。ここでは、NYMEXとUTBPIの中間にある空白のインデックスを取得し、そのインデックスから最後のインデックスまで部分文字列を切り取ります。この場合、私の部分文字列はUTBPIになります。以下で使用しています

set part1 [substr $line [string index  $line " "] [string index  $line end-1]]

以下のエラーが発生します。

wrong # args: should be "string index string charIndex"
    while executing
"string index  $line  "
    ("foreach" body line 2)
    invoked from within
"foreach line $pollerName {
set part1 [substr $line [string index  $line  ] [string index  $line end-1]]
puts $part1
puts $line
}"
    (file "Config.tcl" line 9)

他の文字列操作もどのように行うことができるかについてのアイデアを教えてください。このための良いリンク。

9
Piyush

string range を使用して、空白のインデックスを渡します(string firstなどを使用して見つけることができます) 。

% set s "NYMEX UTBPI"
NYMEX UTBPI
% string range $s 6 end
UTBPI

または、string firstを使用して、空白を動的に検索します。

% set output [string range $s [expr {[string first " " $s] + 1}] end]
UTBPI
7
TrojanName

プロセッサ時間に問題がない場合は、リストに分割して2番目の要素を取得します。

set part1 [lindex [split $line] 1]

文字列に任意の数の単語を含めることができる場合、

set new [join [lrange [split $line] 1 end]]

ただし、私はDonalの提案を使用し、string操作に固執します。

5
glenn jackman

Tclでそれを行う最良の方法は次のとおりだと思います。

set s "NYMEX UTBPI"
regexp -indices " " $s index;
puts [lindex $index 0]

変数インデックスには、一致するパターンの最初と最後のインデックスが含まれます。ここでは、単一の文字を探しているので、最初と最後が同じになるので、使用できます

puts [lindex $index 0]

または

puts [lindex $index 1]

詳細については、これが公式ドキュメントです: http://www.tcl.tk/man/tcl8.5/TclCmd/regexp.htm#M7

1
hzrari