2013-04-10 6 views
8

Mam ciąg znaków podobny do NYMEX UTBPI. Tutaj chcę pobrać indeks białej przestrzeni w środku NYMEX i UTBPI, a następnie z indeksu do ostatniego indeksu chcę wyciąć podciąg. W tym przypadku moja podciąg będzie UTBPI Używam poniżejJak wyciąć podciągi z ciągu znaków w tcl

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

Dostaję poniżej błędu.

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)

Czy możesz dać mi pomysł, w jaki sposób mogę również wykonać inne manewrowanie ciągami. Każdy dobry link do tego.

+0

Problem polega na tym, że '' "oczywiście nie jest prawidłowym indeksem znaków. Podobno chciałeś użyć 'string first' (który jest do wyszukiwania), a nie' string index' (który służy do ekstrakcji). – kostix

+0

Zastanawiam się także, co 'substr' ma tam robić? Czy zastanawiasz się nad swoimi intencjami? – kostix

+0

Użyłbym 'split' lub (bardziej prawdopodobne)' regexp' do tego rodzaju analizy ... –

Odpowiedz

5

Po prostu użyłbym string range i przekazałbym mu indeks białych znaków (które można znaleźć używając string najpierw lub cokolwiek innego).

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

lub używając ciąg pierwszy dynamicznie znaleźć spacje:

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

w tym przypadku mamy białe spacje ('' "') na szóstym indeksie, więc możemy to zrobić, ale przypuśćmy, że nie " • Czy znasz zatem pierwszą długość słowa? więc chcę się dowiedzieć pierwszego wystąpienia indeksu białej przestrzeni od tego miejsca do końca możemy wyciąć.Każdy pomysł. czy możemy zrobić to dynamicznie. – picnic4u

+0

@ picnic4u, użyj ['string first'] (http://www.tcl.tk/man/tcl8.6/TclCmd/string.htm#M8) – kostix

+0

Lub' string last', jeśli szukasz ostatniego przestrzeń zamiast pierwszej. Ale może jesteś pewien, że w ciągu będzie tylko 1 spacja. – potrzebie

1

myślę, że najlepszym sposobem, aby to zrobić w Tcl jest:

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

indeks zmiennej będzie zawierał pierwszy i ostatni indeks pasującego wzorca. Tutaj, podobnie jak szukasz pojedynczego char, pierwszy i ostatni będą takie same, więc można użyć

puts [lindex $index 0] 

lub

puts [lindex $index 1] 

Aby uzyskać więcej informacji, jest to oficjalny dokument: http://www.tcl.tk/man/tcl8.5/TclCmd/regexp.htm#M7

5

Jeśli czas procesora nie jest problemem, podzielić ją na liście i podjąć 2. element:

set part1 [lindex [split $line] 1] 

Jeśli ciąg może mieć dowolną liczbę słów,

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

jednak użyję sugestię Donal i trzymać string operacji.