Apa cara terbaik untuk tokenize / split NSString di Objective-C?
objective-c
cocoa
tokenize
Ned Batchelder
sumber
sumber
[anArray componentsJoinedByString:@":"];
.componentsSeparatedByCharactersInSet
. Lihat jawaban di bawah ini.Semua orang telah menyebutkan
componentsSeparatedByString:
tetapi Anda juga dapat menggunakanCFStringTokenizer
(ingat bahwaNSString
danCFString
dapat dipertukarkan) yang juga akan mengubah bahasa alami (seperti Cina / Jepang yang tidak membagi kata pada spasi).sumber
enumerateLinesUsingBlock:
danenumerateSubstringsInRange:options:usingBlock:
, yang terakhir adalah versi berbasis blok dari CFStringTokenizer. developer.apple.com/mac/library/documentation/Cocoa/Reference/… : developer.apple.com/mac/library/documentation/Cocoa/Reference/… :enumerate
metode yang tersedia di iOS 4 dan kemudian, juga.Jika Anda hanya ingin membagi string, gunakan
-[NSString componentsSeparatedByString:]
. Untuk tokenisasi yang lebih kompleks, gunakan kelas NSScanner.sumber
Jika kebutuhan tokenization Anda lebih kompleks, lihat toolkit tokenizing / parsing string open source Cocoa saya: ParseKit:
http://parsekit.com
Untuk pemisahan string menggunakan char pembatas (seperti ':'), ParseKit pasti akan berlebihan. Tetapi sekali lagi, untuk kebutuhan tokenization yang kompleks, ParseKit sangat kuat / fleksibel.
Lihat juga dokumentasi Tokenisasi ParseKit .
sumber
Jika Anda ingin tokenize pada banyak karakter, Anda dapat menggunakan NSString
componentsSeparatedByCharactersInSet
. NSCharacterSet memiliki beberapa set pre-made yang berguna sepertiwhitespaceCharacterSet
danillegalCharacterSet
. Dan memiliki inisialisasi untuk rentang Unicode.Anda juga dapat menggabungkan set karakter dan menggunakannya untuk tokenize, seperti ini:
Ketahuilah bahwa
componentsSeparatedByCharactersInSet
akan menghasilkan string kosong jika menjumpai lebih dari satu anggota charSet berturut-turut, jadi Anda mungkin ingin menguji untuk panjang kurang dari 1.sumber
Jika Anda ingin menandai string ke dalam istilah pencarian sambil mempertahankan "frasa yang dikutip", berikut adalah
NSString
kategori yang menghormati berbagai jenis pasangan kutipan:""
''
‘’
“”
Pemakaian:
Kode:
sumber
Jika Anda mencari fitur linguistik dari string (Kata, paragraf, karakter, kalimat, dan baris), gunakan enumerasi string:
Api ini bekerja dengan bahasa lain di mana spasi tidak selalu merupakan pembatas (misalnya Jepang). Juga menggunakan
NSStringEnumerationByComposedCharacterSequences
adalah cara yang tepat untuk menghitung lebih dari karakter, karena banyak karakter non-barat lebih dari satu byte.sumber
Saya punya kasus di mana saya harus membagi output konsol setelah permintaan LDAP dengan ldapsearch. Pertama-tama mengatur dan menjalankan NSTask (saya menemukan contoh kode yang baik di sini: Jalankan perintah terminal dari aplikasi Cocoa ). Tapi kemudian saya harus membagi dan mengurai output sehingga hanya mengekstrak nama server cetak dari Ldap-query-output. Sayangnya itu adalah manipulasi string yang membosankan yang tidak akan menjadi masalah sama sekali jika kita ingin memanipulasi C-string / array dengan operasi C-array yang sederhana. Jadi di sini adalah kode saya menggunakan objek kakao. Jika Anda memiliki saran yang lebih baik, beri tahu saya.
sumber
Saya sendiri menemukan contoh di mana tidak cukup hanya memisahkan string dengan komponen banyak tugas seperti
1) Mengkategorikan token menjadi tipe
2) Menambahkan token baru
3) Memisahkan string antara penutupan kustom seperti semua kata antara "{" dan "} "
Untuk persyaratan seperti itu saya menemukan Parse Kit penyelamat.
Saya menggunakannya untuk mem-parsing file .PGN (notasi game prtable) berhasil dengan sangat cepat dan ringan.
sumber