Pertanyaan NSPredicate dengan string yang mencocokkan awal kata


Ini harus duplikat. Tetapi dengan begitu banyak pertanyaan NSPredicate di luar sana, saya tidak dapat menemukan yang benar.

Saya memiliki daftar objek Core Data yang berisi compositeName bidang. Nama seperti 'Emily Blunt' bisa ada di sana. Saya ingin mencari daftar menggunakan NSPredicate yang akan membiarkan saya mencari "Em" tetapi juga untuk "Bl" dan kemudian nama ini muncul dalam hasil yang diambil.

Ini pasti sangat mudah, tetapi seperti yang Anda duga, saya tidak melihatnya. Usaha saya yang tidak berfungsi pada NSPredicate dengan ekspresi reguler terlihat seperti ini:

[NSPredicate predicateWithFormat:@"compositeName MATCHES[cd] '.*(?<=^|\\s)%@.*'", query];

Pemikiran saya untuk ekspresi reguler ini adalah:

  • sejumlah karakter sebelumnya
  • ruang lookbehind negatif atau awal
  • permintaan
  • sejumlah karakter sesudahnya

Tapi itu tidak berhasil. Saya tidak mendapatkan hasil apa pun. Bagaimana saya memperbaikinya?

P.S. Jika ada solusi NSPredicate tanpa Regular Expressions yang sesuai dengan tujuan saya juga.


8
2018-06-17 12:58


asal


Jawaban:


Anda perlu membangun seluruh pola string regex di luar string predikat, lalu meneruskannya ke predikat.

Juga, ada konstruksi regex \b untuk mencocokkan batas kata, yang adalah apa yang Anda cari.

Jadi, semuanya, potongan ini seharusnya memberi Anda solusi sederhana untuk masalah Anda:

NSString *searchString = @"Em";
NSString *regexString  = [NSString stringWithFormat:@".*\\b%@.*", searchString];

NSPredicate *pred = [NSPredicate predicateWithFormat:@"self.compositeName matches[cd] %@", regexString];

Jika teks pencarian input belum dibersihkan, Anda mungkin ingin melakukannya sebelum Anda meneruskannya ke mesin regex.

Peningkatan lain dapat berupa menerima karakter unicode pada batas kata untuk memungkinkan orang mencari 'Ántonio', 'Über' dan string serupa lainnya.

Baris kode berikut akan membuat pola regex yang akan mengurus kedua aspek:

NSString *orgSearchString = @"^";

NSString *escapedSearchString = [NSRegularExpression escapedPatternForString: orgSearchString];

NSString *regexString  = [NSString stringWithFormat:@"(?w:).*\\b%@.*", escapedSearchString];

16
2018-06-17 15:29