Mendeteksi jika NSString mengandung ...?


124

Bagaimana saya bisa mendeteksi jika string berisi kata tertentu? Sebagai contoh, saya memiliki string di bawah ini yang bertuliskan:

@"Here is my string."

Saya ingin tahu apakah saya dapat mendeteksi kata dalam string, seperti "adalah" misalnya.


kemungkinan duplikat dari Pencarian NSString Cocoa?
kennytm

26
dapatkah kamu menerima jawaban?
Jacob Relkin

Solusi murah-dan-kotor, jika string diasumsikan tidak mengandung tanda baca, adalah untuk menggabungkan kosong di bagian depan dan belakang string KEDUA, maka lakukan rangeOfString.
Hot Licks

Jawaban:


192

Begini cara saya melakukannya:

NSString *someString = @"Here is my string";
NSRange isRange = [someString rangeOfString:@"is " options:NSCaseInsensitiveSearch];
if(isRange.location == 0) {
   //found it...
} else {
   NSRange isSpacedRange = [someString rangeOfString:@" is " options:NSCaseInsensitiveSearch];
   if(isSpacedRange.location != NSNotFound) {
      //found it...
   }
}

Anda dapat dengan mudah menambahkan ini sebagai kategori ke NSString:

@interface NSString (JRStringAdditions) 

- (BOOL)containsString:(NSString *)string;
- (BOOL)containsString:(NSString *)string
               options:(NSStringCompareOptions)options;

@end

@implementation NSString (JRStringAdditions) 

- (BOOL)containsString:(NSString *)string
               options:(NSStringCompareOptions)options {
   NSRange rng = [self rangeOfString:string options:options];
   return rng.location != NSNotFound;
}

- (BOOL)containsString:(NSString *)string {
   return [self containsString:string options:0];
}

@end

2
Sebenarnya Anda bisa menambahkan ruang pada awal dan akhir string dan "is" akan cocok dengan string yang dimulai dengan "is"
user4951

Ini mengejutkan saya bahwa ini bukan bagian dari kelas standar. Terima kasih, @ Jacob!
big_m

1
Sebenarnya, "panjang" dari NSRange harus diuji ... bukan "lokasi". Di sini langsung dari sumber: "Metode ini mengembalikan panjang == 0 jika string target tidak ditemukan. Jadi, untuk memeriksa penahanan: ([ str rangeOfString: @ "target"]. length> 0). Perhatikan bahwa panjang rentang yang dikembalikan oleh metode ini mungkin berbeda dari panjang string target, karena karakter tersusun dan semacamnya. "
GtotheB

Mulai dari iOS 8.0, ada metode baru yang disebut containsStringterpapar di NSString.
tedyyu

89

Gunakan kode berikut untuk memindai kata dalam kalimat.

NSString *sentence = @"The quick brown fox";
NSString *word = @"quack";
if ([sentence rangeOfString:word].location != NSNotFound) {
    NSLog(@"Yes it does contain that word");
}

bagaimana saya bisa mendapatkan lokasi ketika saya menggunakan metode ini pada array?
Hakim

Tergantung apa yang Anda gunakan dalam pencarian dalam array. Tanpa menggunakan komparator, saya pikir cara terbaik adalah loop melalui array dan memeriksa setiap string untuk string pencarian. NSString * searchString; for (NSString * string in array) {if ([string rangeOfString: searchString options: NSCaseInsensitiveSearch] .lokasi! = NSNotFound) {// Tidak di string} lain {// Dalam string ini}} Anda kemudian dapat menambahkan string yang melakukan mengandungnya ke array bisa berubah baru yang memungkinkan Anda untuk menunjukkan mereka jika Anda mencari
simon_smiley

ps Pemformatan semuanya benar dalam kode di atas tetapi jelas dihaluskan dengan berada di komentar
simon_smiley

22

Di iOS8 sekarang Anda dapat menggunakan:

BOOL containsString = [@"Here is my string." containsString:@"is"];

Ada posting yang menarik tentang cara "retrofit" ke iOS7 di sini: http://petersteinberger.com/blog/2014/retrofitting-containsstring-on-ios-7/


Ini akan menjadi metode praktis yang sangat bagus. Sayangnya itu tidak didokumentasikan dan oleh karena itu API pribadi
Centurion

2
Jelas bukan API pribadi. Periksa file NSString.h dan Anda akan melihatnya.
Brian Sachetta

3

Saya sarankan menggunakan NSLinguisticTagger . Kita bisa menggunakannya untuk mencariHere is my string. His isn't a mississippi isthmus. It is?

NSLinguisticTagger *linguisticTagger = [[NSLinguisticTagger alloc] initWithTagSchemes:@[
                                        NSLinguisticTagSchemeTokenType,
                                        ]
                                                                              options:
                                        NSLinguisticTaggerOmitPunctuation |
                                        NSLinguisticTaggerOmitWhitespace |
                                        NSLinguisticTaggerOmitOther ];
[linguisticTagger setString:@"Here is my string. His isn't a mississippi isthmus. It is?"];
[linguisticTagger enumerateTagsInRange:NSMakeRange(0,
                                                   [[linguisticTagger string] length])
                                scheme:NSLinguisticTagSchemeTokenType
                               options:
 NSLinguisticTaggerOmitPunctuation |
 NSLinguisticTaggerOmitWhitespace |
 NSLinguisticTaggerOmitOther |
 NSLinguisticTaggerJoinNames
                            usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop) {
                                NSLog(@"tag: %@, tokenRange: %@, sentenceRange: %@, token: %@",
                                      tag,
                                      NSStringFromRange(tokenRange),
                                      NSStringFromRange(sentenceRange),
                                      [[linguisticTagger string] substringWithRange:tokenRange]);
                            }];

Output ini:

tag: Word, tokenRange: {0, 4}, sentenceRange: {0, 19}, token: Here
tag: Word, tokenRange: {5, 2}, sentenceRange: {0, 19}, token: is
tag: Word, tokenRange: {8, 2}, sentenceRange: {0, 19}, token: my
tag: Word, tokenRange: {11, 6}, sentenceRange: {0, 19}, token: string
tag: Word, tokenRange: {19, 3}, sentenceRange: {19, 33}, token: His
tag: Word, tokenRange: {23, 2}, sentenceRange: {19, 33}, token: is
tag: Word, tokenRange: {25, 3}, sentenceRange: {19, 33}, token: n't
tag: Word, tokenRange: {29, 1}, sentenceRange: {19, 33}, token: a
tag: Word, tokenRange: {31, 11}, sentenceRange: {19, 33}, token: mississippi
tag: Word, tokenRange: {43, 7}, sentenceRange: {19, 33}, token: isthmus
tag: Word, tokenRange: {52, 2}, sentenceRange: {52, 6}, token: It
tag: Word, tokenRange: {55, 2}, sentenceRange: {52, 6}, token: is

Mengabaikan His mississippidan isthmusdan bahkan mengidentifikasi isbagian dalam isn't.


3

Saya harap ini membantu Anda, .. tambahkan baris ini di file .m atau buat kelas terpisah dan integrasikan kode ini.

@implementation NSString (Contains)

- (BOOL) containsString: (NSString*) substring
{
NSRange range = [self rangeOfString : substring];
BOOL found = ( range.location != NSNotFound );
return found;
}    
@end

2

Dengan iOS 8 dan Swift, kita dapat menggunakan metode localizedCaseInsensitiveContainsString

 let string: NSString = "Café"
 let substring: NSString = "É"

 string.localizedCaseInsensitiveContainsString(substring) // true

0

Solusi lengkap pertama-tama akan memindai string (tanpa tambahan kosong), kemudian memeriksa apakah karakter sebelumnya yang kosong atau awal baris. Demikian pula, periksa apakah karakter yang mengikuti segera apakah kosong atau ujung baris. Jika kedua tes lulus maka Anda memiliki kecocokan. Tergantung pada kebutuhan Anda, Anda mungkin juga memeriksa ,, ., (), dll

Pendekatan alternatif, tentu saja, adalah mengurai string menjadi kata-kata dan memeriksa setiap kata secara terpisah.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.