Jaki jest najlepszy sposób na tokenizację / podział NSString w Objective-C?
objective-c
cocoa
tokenize
Ned Batchelder
źródło
źródło
[anArray componentsJoinedByString:@":"];
.componentsSeparatedByCharactersInSet
. Zobacz odpowiedź poniżej.Wszyscy o tym wspominali,
componentsSeparatedByString:
ale możesz także użyćCFStringTokenizer
(pamiętaj, żeNSString
iCFString
są wymienne), które również tokenizują języki naturalne (takie jak chiński / japoński, które nie dzielą słów na spacje).źródło
enumerateLinesUsingBlock:
aenumerateSubstringsInRange:options:usingBlock:
ten ostatni jest wersją CFStringTokenizer opartą na blokach. developer.apple.com/mac/library/documentation/Cocoa/Reference/… : developer.apple.com/mac/library/documentation/Cocoa/Reference/… :enumerate
są dostępne w iOS 4 i nowszych metod, zbyt.Jeśli chcesz tylko podzielić ciąg, użyj
-[NSString componentsSeparatedByString:]
. Aby uzyskać bardziej złożoną tokenizację, użyj klasy NSScanner.źródło
Jeśli Twoje potrzeby w zakresie tokenizacji są bardziej złożone, zapoznaj się z moim zestawem narzędzi do tokenizacji / analizowania ciągu Cocoa String typu open source: ParseKit:
http://parsekit.com
W przypadku prostego dzielenia ciągów za pomocą znaku separatora (takiego jak „:”), ParseKit byłby zdecydowanie przesadą. Ale znowu, w przypadku złożonych potrzeb tokenizacji, ParseKit jest niezwykle wydajny / elastyczny.
Zobacz także dokumentację dotyczącą tokenizacji ParseKit .
źródło
Jeśli chcesz tokenizować wiele znaków, możesz użyć NSString
componentsSeparatedByCharactersInSet
. NSCharacterSet ma kilka przydatnych gotowych zestawów, takich jakwhitespaceCharacterSet
iillegalCharacterSet
. I ma inicjatory dla zakresów Unicode.Możesz także łączyć zestawy znaków i używać ich do tokenizacji, na przykład:
Należy pamiętać, że
componentsSeparatedByCharactersInSet
jeśli napotka więcej niż jeden element członkowski charSet w rzędzie, spowoduje to powstanie pustych ciągów, więc warto przetestować długość mniejszą niż 1.źródło
Jeśli chcesz tokenizować ciąg znaków na wyszukiwane hasła, zachowując „cytowane frazy”, oto
NSString
kategoria uwzględniająca różne typy par cudzysłowu:""
''
‘’
“”
Stosowanie:
Kod:
źródło
Jeśli szukasz podziału funkcji lingwistycznych w ciągu (słowa, akapity, znaki, zdania i wiersze), użyj wyliczania ciągów:
Ten interfejs API działa z innymi językami, w których spacje nie zawsze są separatorem (np. Japoński). Używanie
NSStringEnumerationByComposedCharacterSequences
jest również właściwym sposobem wyliczania znaków, ponieważ wiele znaków innych niż zachodnie ma więcej niż jeden bajt długości.źródło
Miałem przypadek, w którym musiałem podzielić dane wyjściowe konsoli po zapytaniu LDAP za pomocą ldapsearch. Najpierw skonfiguruj i wykonaj NSTask (znalazłem tutaj dobry przykład kodu: Wykonaj polecenie terminala z aplikacji Cocoa ). Ale potem musiałem podzielić i przeanalizować dane wyjściowe, aby wyodrębnić tylko nazwy serwera wydruku z wyjścia zapytania Ldap. Niestety jest to raczej żmudna manipulacja ciągami znaków, która nie byłaby żadnym problemem, gdybyśmy mieli manipulować napisami / tablicami w języku C za pomocą prostych operacji na tablicach C. Oto mój kod wykorzystujący obiekty kakaowe. Jeśli masz lepsze sugestie, daj mi znać.
źródło
Sam natrafiłem na przypadek, w którym nie wystarczyło po prostu oddzielić ciąg znaków przez składnik wielu zadań, takich jak
1) Kategoryzowanie tokenu na typy
2) Dodawanie nowych tokenów
3) Oddzielanie ciągu między niestandardowymi zamknięciami, jak wszystkie słowa między "{" i "} „
W przypadku takich wymagań zestaw Parse Kit uratował mi życie.
Użyłem go do analizowania plików .PGN (prtable gaming notation) z powodzeniem, jest bardzo szybki i lekki.
źródło