2013-04-10 23 views
8

Tôi có chuỗi như NYMEX UTBPI. Ở đây tôi muốn lấy chỉ mục của khoảng trắng ở giữa NYMEX và UTBPI và sau đó từ chỉ mục đó đến chỉ mục cuối cùng tôi muốn cắt chuỗi con. Trong trường hợp này chuỗi con của tôi sẽ UTBPI Tôi đang sử dụng dưới đâyLàm cách nào để cắt chuỗi con khỏi chuỗi trong tcl

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

Tôi nhận được dưới đây lỗi.

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)

Bạn có thể cho tôi ý tưởng về cách tôi có thể thực hiện một số thao tác chuỗi khác không. Bất kỳ liên kết tốt cho việc này.

+0

Vấn đề là '" "' rõ ràng không phải là chỉ mục ký tự hợp lệ. Giả sử bạn muốn sử dụng 'chuỗi đầu tiên' (để tìm kiếm), không phải' chuỗi chỉ mục' (để khai thác). – kostix

+0

Tôi cũng tự hỏi 'substr' có nghĩa vụ phải làm gì ở đó? Bạn có quan tâm để xây dựng trên ý định của bạn? – kostix

+0

Tôi muốn sử dụng 'phân tách' hoặc (nhiều khả năng)' regexp' để thực hiện phân tích cú pháp này ... –

Trả lời

5

Tôi chỉ sẽ sử dụng string range và vượt qua nó chỉ số của khoảng trắng (mà bạn có thể tìm thấy bằng chuỗi đầu tiên hoặc bất cứ điều gì).

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

Hoặc sử dụng chuỗi đầu tiên để tự động tìm các khoảng trắng:

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

trong trường hợp này chúng ta có khoảng trắng ('" "') ở chỉ mục thứ 6 để chúng ta có thể làm được nhưng giả sử chúng ta don ' t biết chiều dài từ đầu tiên sau đó? vì vậy tôi muốn tìm hiểu sự xuất hiện đầu tiên của chỉ số không gian trắng sau đó từ đó đến cuối chúng tôi có thể cắt. Bất kỳ đề xuất nào. chúng ta có thể làm điều đó một cách năng động. – picnic4u

+0

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

+0

Hoặc' chuỗi cuối cùng' nếu bạn đang tìm kiếm không gian thay vì cái đầu tiên. Nhưng có thể bạn chắc chắn rằng sẽ chỉ có 1 dấu cách trong chuỗi. – potrzebie

1

Tôi nghĩ rằng, cách tốt nhất để làm điều đó trong Tcl, là:

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

chỉ số biến sẽ chứa chỉ mục đầu tiên và cuối cùng của mẫu phù hợp của bạn. Ở đây, như bạn đang tìm kiếm char duy nhất, đầu tiên và cuối cùng sẽ giống nhau, vì vậy bạn có thể sử dụng

puts [lindex $index 0] 

hoặc

puts [lindex $index 1] 

Mọi chi tiết, đây là doc chính thức: http://www.tcl.tk/man/tcl8.5/TclCmd/regexp.htm#M7

5

Nếu thời gian xử lý không phải là một vấn đề, chia nó thành một danh sách và đưa các yếu tố thứ 2:

set part1 [lindex [split $line] 1] 

Nếu chuỗi có thể có một số tùy ý các từ ngữ,

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

Tuy nhiên, tôi muốn sử dụng gợi ý Donal và gắn bó với string hoạt động.

Các vấn đề liên quan