2013-04-10 3 views
8

У меня есть строка как NYMEX UTBPI. Здесь я хочу получить индекс белого пространства в середине NYMEX и UTBPI, а затем из этого индекса в последний индекс хочу вырезать подстроку. В этом случае моя подстрока будет UTBPI Я использую нижеКак вырезать подстроку из строки в tcl

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)

Можете ли вы дать мне представление о том, как я могу выполнить и другие manupulation строки. Любая хорошая ссылка для этого.

+0

Проблема в том, что '' '', очевидно, не является допустимым символьным индексом. Предположительно, вы хотели использовать 'string first' (который для поиска), а не' string index' (который предназначен для извлечения). – kostix

+0

Я также задаюсь вопросом, что там должен делать 'substr'? Вы хотите уточнить свои намерения? – kostix

+0

Я бы использовал 'split' или (более вероятно)' regexp' для этого вида разбора ... –

ответ

5

Я бы просто использовал string range и передал ему указатель пробела (который вы можете найти с помощью строки сначала или что-то еще).

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

Или с помощью строки первого динамически найти пробелы:

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

В этом случае у нас есть пробел ('' '') на 6-м индексе, поэтому мы можем это сделать, но предположим, Знаете ли вы первую длину слова? , так что я хочу узнать первое появление индекса белого пространства, а затем оттуда до конца мы можем разрезать. Любое предложение. мы можем сделать это динамически. – picnic4u

+0

@ picnic4u, используйте ['string first'] (http://www.tcl.tk/man/tcl8.6/TclCmd/string.htm#M8) – kostix

+0

Или' string last', если вы ищете последнюю а не первый. Но, возможно, вы уверены, что в строке будет только 1 пробел. – potrzebie

1

Я думаю, лучший способ сделать это в 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

5

Если процессорное время не является проблемой, разделить его в список и взять 2 элемента:

set part1 [lindex [split $line] 1] 

I е строка может иметь произвольное количество слов,

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

Однако, я хотел бы использовать предложение Донал и придерживаться string операций.

Смежные вопросы