2013-04-10 16 views
8

Ho una stringa come NYMEX UTBPI. Qui voglio recuperare l'indice dello spazio bianco nel mezzo di NYMEX e UTBPI e quindi da quell'indice all'ultimo indice voglio tagliare la sottostringa. In questo caso il mio stringa sarà UTBPI sto usando qui sottoCome posso tagliare la sottostringa da una stringa in tcl

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

sto ottenendo sotto l'errore.

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)

Potete darmi l'idea su come posso fare anche qualche altro manupulation di stringhe. Qualsiasi buon collegamento per questo.

+0

Il problema è che "" "' ovviamente non è un indice di caratteri valido. Si suppone che si volesse usare 'string first' (che è per la ricerca), non' string index' (che è per l'estrazione). – kostix

+0

Mi chiedo anche che cosa dovrebbe fare il 'substr' lì? Ti interessa elaborare il tuo intento? – kostix

+0

Vorrei usare 'split' o (più probabilmente)' regexp' per fare questo tipo di parsing ... –

risposta

5

Vorrei solo utilizzare string range e passare l'indice degli spazi bianchi (che è possibile trovare utilizzando stringa prima o qualsiasi altra cosa).

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

o utilizzando stringa prima per trovare in modo dinamico gli spazi:

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

in questo caso abbiamo lo spazio bianco ('" "') al sesto indice in modo che possiamo farlo ma supponiamo di non indossare so la lunghezza della prima parola allora? quindi voglio scoprire la prima occorrenza dell'indice dello spazio bianco, quindi da lì alla fine possiamo tagliare. Qualsiasi suggerimento. possiamo farlo dinamicamente. – picnic4u

+0

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

+0

Oppure' string lo scorso 'se stai cercando l'ultimo spazio piuttosto che il primo. Ma forse sei sicuro che ci sarà solo 1 spazio nella stringa. – potrzebie

1

credo, il modo migliore per farlo in Tcl, è:

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

l'indice variabile conterrà il primo e l'ultimo indice del tuo modello di corrispondenza. Qui, come si sta cercando per singolo carattere, primo e l'ultimo sarà lo stesso, in modo da poter utilizzare

puts [lindex $index 0] 

o

puts [lindex $index 1] 

Per maggiori informazioni, questo è il documento ufficiale: http://www.tcl.tk/man/tcl8.5/TclCmd/regexp.htm#M7

5

Se il tempo di processore non è un problema, dividerlo in una lista e prendere la 2 ° elemento:

set part1 [lindex [split $line] 1] 

Se la stringa può avere un numero arbitrario di parole,

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

Tuttavia, mi piacerebbe utilizzare il suggerimento di Donal e bastone con string operazioni.

Problemi correlati