2012-07-29 13 views
5

Mam ciąg znaków i chcę sprawdzić, czy zaczyna się od określonej litery (w tym przypadku #). Chciałbym poznać najbardziej efektywny sposób robienia tego!Jaki jest najskuteczniejszy sposób sprawdzenia, czy ciąg zaczyna się od określonej litery w TCL?

To, o czym myślę, to if {[string compare -length 1 $string "#"]}, ponieważ może użyć metody strcmp(), która prawdopodobnie będzie jednym z najszybszych sposobów osiągnięcia tego.

To, co myślę, że może być również możliwe, to if {[string index $string 1] == "#"}, ponieważ może zawierać * ciąg == "#", który prawdopodobnie będzie również bardzo szybki.

Co myślisz?

+1

Podczas gdy 'string compare -length' kończy się na używaniu odpowiednika' strncmp() ', musi być bardziej ostrożny niż możesz sobie wyobrazić, ponieważ Tcl używa znaków Unicode, a nie ASCII _ i_ NUL jest postacią prawną w Tcl strunowy. –

Odpowiedz

12

Najszybszym sposobem sprawdzenia, czy ciąg rozpoczyna się specyfiką jest string match:

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

Kod zrobić dopasowanie widzi, że nie jest gwiazdą po pierwszym znaku, a następnie koniec napisu, i tak przestaje badać resztę $string. Nie wymaga też alokacji wyniku (innego niż boolowski, co jest szczególnym przypadkiem, ponieważ string match jest również kompilowany bajtowo).

+0

Podczas gdy "dopasowanie smyczków" było najbardziej intuicyjną rzeczą, jaką mogłem wymyślić, warto się nauczyć, że jest ona również skuteczna. Pomyślałbym, że byłoby mniej wydajne, ponieważ musi analizować wszystkie rodzaje symboli wieloznacznych i innych rzeczy. No cóż, teraz używam 'ciągowego dopasowania', dziękuję! – Jerry

+0

@Jerry: "Symbol wieloznaczny na końcu" jest szczególnym przypadkiem w kodzie Matchera. –

0

Tak [string match "*" $ string_name] to właśnie dla mnie zadziałało. Jest to naprawdę szybkie w porównaniu z regexp lub jakimkolwiek innym narzędziem.

Powiązane problemy