2012-07-29 24 views
5

Tôi có một chuỗi và tôi muốn kiểm tra xem nó có bắt đầu bằng một ký tự nhất định hay không (# trong trường hợp này). Tôi muốn biết cách hiệu quả nhất để làm điều này!Cách hiệu quả nhất để kiểm tra xem chuỗi có bắt đầu bằng một ký tự nhất định trong TCL hay không?

Những gì tôi đang nghĩ đến là if {[string compare -length 1 $string "#"]}, bởi vì nó có thể sử dụng strcmp() mà có lẽ sẽ là một trong những cách nhanh nhất để đạt được điều này.

Điều tôi nghĩ cũng có thể là if {[string index $string 1] == "#"}, vì nó có thể làm * string == '#', điều này có thể cũng sẽ rất nhanh.

Bạn nghĩ gì?

+1

Trong khi 'chuỗi so sánh -length' kết thúc bằng cách sử dụng' strncmp() ', nó phải cẩn thận hơn bạn tưởng tượng vì Tcl sử dụng ký tự Unicode và không phải ASCII _and_ NUL là một ký tự hợp pháp trong Tcl chuỗi. –

Trả lời

12

Phương pháp nhanh nhất của kiểm tra xem một chuỗi bắt đầu với một nhân vật cụ thể là string match:

if {[string match "#*" $string]} { ... } 

Mã để làm khớp thấy rằng có một ngôi sao sau khi ký tự đầu tiên và sau đó là kết thúc của chuỗi, và do đó dừng kiểm tra phần còn lại của $string. Nó cũng không yêu cầu bất kỳ sự phân bổ kết quả nào (khác với một boolean, một trường hợp đặc biệt vì string match cũng được biên dịch bytecode).

+0

Trong khi 'chuỗi trận đấu' là điều trực quan nhất tôi có thể nghĩ đến, thật thú vị khi biết nó cũng hiệu quả. Tôi đã nghĩ rằng nó sẽ kém hiệu quả hơn vì nó phải phân tích tất cả các loại ký tự đại diện và các thứ. Vâng, tôi đang sử dụng 'chuỗi trận đấu', cảm ơn bạn! – Jerry

+0

@Jerry: "Ký tự đại diện ở cuối" là trường hợp đặc biệt trong mã đối sánh. –

0

Có [chuỗi kết hợp "*" $ string_name] đây là những gì phù hợp với tôi. Điều này thực sự nhanh so với regexp hoặc bất kỳ tiện ích nào khác.

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