Bagaimana cara saya memeriksa apakah sebuah string berisi string lain di Objective-C?

1212

Bagaimana saya bisa memeriksa apakah string ( NSString) berisi string lain yang lebih kecil?

Saya berharap untuk sesuatu seperti:

NSString *string = @"hello bla bla";
NSLog(@"%d",[string containsSubstring:@"hello"]);

Tapi yang paling dekat yang bisa saya temukan adalah:

if ([string rangeOfString:@"hello"] == 0) {
    NSLog(@"sub string doesnt exist");
} 
else {
    NSLog(@"exists");
}

Ngomong-ngomong, apakah itu cara terbaik untuk menemukan jika string berisi string lain?

Jonathan.
sumber
1
Saya ingin melihatnya ditambahkan juga, tetapi sementara itu relatif mudah untuk menambahkannya sebagai kategori di NSString.
isaac
2
Menggunakan if ([string rangeOfString:@"hello"] == 0) {...}ada kesalahan ketik ketidakcocokan untuk NSRange dan int. untuk memperbaikinya, Anda harus mengubah jalur menjadi yang berikut:if ([string rangeOfString:@"hello"].length == 0) {...}
Neeku
1
iOS 8 menambahkan containString: dan di sini adalah cara invasif minimal untuk menambahkan dukungan iOS 7 petersteinberger.com/blog/2014/...
Steve Moser
2
Saya telah menjadi pengembang iOS sejak awal dan saya terus mengunjungi kembali posting ini untuk mendapatkan salinan cepat. Saya tidak bisa mengingat yang ini. Posting stackoverflow yang paling banyak dikunjungi dalam riwayat saya.
VaporwareWolf
cukup gunakan Swift;)
Fattie

Jawaban:

2436
NSString *string = @"hello bla bla";
if ([string rangeOfString:@"bla"].location == NSNotFound) {
  NSLog(@"string does not contain bla");
} else {
  NSLog(@"string contains bla!");
}

Kuncinya adalah memperhatikan bahwa rangeOfString:mengembalikan sebuah NSRangestruct, dan dokumentasi mengatakan bahwa itu mengembalikan struct {NSNotFound, 0}jika "tumpukan jerami" tidak mengandung "jarum".


Dan jika Anda menggunakan iOS 8 atau OS X Yosemite, Anda sekarang dapat melakukan: (* CATATAN: Ini AKAN crash aplikasi Anda jika kode ini dipanggil pada perangkat iOS7).

NSString *string = @"hello bla blah";
if ([string containsString:@"bla"]) {
  NSLog(@"string contains bla!");
} else {
  NSLog(@"string does not contain bla");
}

(Ini juga cara kerjanya di Swift)

👍

Dave DeLong
sumber
286
Untuk membuat sebuah case case search tidak peka gunakan opsi "if ([string rangeOfString: @" bla ": NSCaseInsensitiveSearch] .lokasi! = NSNotFound)"
Vanja
1
@Dave DeLong Saya hanya akan menyebutkan Kategori yang saya buat untuk tujuan ini sebelum saya membaca hasil edit Anda untuk jawabannya! Karena saya terutama pengembang ac #, saya senang mereka menambahkan metode berisi ke NSSTring.
dherrin79
Mengapa kompiler tidak mengatakan apa-apa jika target penyebaran saya adalah iOS7 dan saya menggunakan containString?
Ricardo
3
Dan untuk lebih jauh lagi titik yang dibuat oleh @Vanja: jika Anda akan menggunakan kode pintas [string berisiString] yang diperkenalkan di iOS 8 / Yosemite, Anda dapat menggunakan kode berikut untuk sebuah case case-insensitive: "[stringToSearch localizedCaseInsensitiveContainsString: string ] ", dan yang ini jika Anda ingin melakukan case dan pencarian tidak sensitif diacritic:" [stringToSearch localizedStandardContainsString: string] ".
Scott Kohlert
1
Perhatikan bahwa ekspresi [string rangeOfString:@"bla"].location != NSNotFoundakan benar ketika string nil!
funroll
158

Untuk iOS 8.0+ dan macOS 10.10+, Anda dapat menggunakan bahasa NSString containsString:.

Untuk versi iOS dan macOS yang lebih lama, Anda dapat membuat kategori Anda sendiri (usang) untuk NSString:

@interface NSString ( SubstringSearch )
    - (BOOL)containsString:(NSString *)substring;
@end

// - - - - 

@implementation NSString ( SubstringSearch )

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

@end

Catatan: Amati komentar Daniel Galasko di bawah ini tentang penamaan

P i
sumber
13
+1 untuk kode yang dihasilkan lebih jelas dan dapat digunakan kembali. Saya mengubahnya menjadi satu liner return [self rangeOfString:substring].location != NSNotFound;dan memasukkannya ke dalam perpustakaan refactoring saya, es_ios_utils. github.com/peterdeweese/es_ios_utils
Peter DeWeese
4
Sepertinya Apple menyukai ide Anda dan menambahkan fitur ini di iOS 8 dan OSx 10.10 (Yosemite) sebagaimana @DaveDeLong disebutkan dalam jawabannya. +1
Islam Q.
7
Aturan utama untuk kategori obj-c adalah awalan nama metode dengan awalan modul 3 huruf Anda. Ini adalah contoh sempurna karena sekarang bertentangan dengan rilis iOS 7 dan 10.10
Daniel Galasko
54

Karena ini tampaknya merupakan hasil peringkat tinggi di Google, saya ingin menambahkan ini:

iOS 8 dan OS X 10.10 menambahkan containsString:metode ini ke NSString. Versi terbaru dari contoh Dave DeLong untuk sistem tersebut:

NSString *string = @"hello bla bla";
if ([string containsString:@"bla"]) {
    NSLog(@"string contains bla!");
} else {
    NSLog(@"string does not contain bla");
}
Lukas
sumber
39
NSString *myString = @"hello bla bla";
NSRange rangeValue = [myString rangeOfString:@"hello" options:NSCaseInsensitiveSearch];

if (rangeValue.length > 0)
{
    NSLog(@"string contains hello");
} 
else 
{
    NSLog(@"string does not contain hello!");
}

// Anda juga bisa menggunakan yang berikut:

if (rangeValue.location == NSNotFound) 
{
    NSLog(@"string does not contain hello");
} 
else 
{
    NSLog(@"string contains hello!");
}
AJS
sumber
22

Dengan iOS 8 dan Swift , kita dapat menggunakan localizedCaseInsensitiveContainsString metode

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

 string.localizedCaseInsensitiveContainsString(substring) // true
Govind
sumber
1
Ini bagus. Tidak tahu mengapa mereka tidak memiliki metode ini untuk ios 7
Lucas
@Lucas, karena Swift diluncurkan dengan iOS 8.0. tetapi dengan cepat Anda masih dapat mendukung perangkat dengan iOS 7.
Hemang
13

Jadi secara pribadi saya benar-benar benci NSNotFoundtetapi mengerti perlunya.

Tetapi beberapa orang mungkin tidak memahami kompleksitas perbandingan terhadap NSNotFound

Misalnya, kode ini:

- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
    if([string rangeOfString:otherString].location != NSNotFound)
        return YES;
    else
        return NO;
}

memiliki masalah:

1) Jelas jika otherString = nilkode ini macet. tes sederhana adalah:

NSLog(@"does string contain string - %@", [self doesString:@"hey" containString:nil] ? @"YES": @"NO");

hasil !! Hancurkan !!

2) Apa yang tidak begitu jelas bagi seseorang yang baru ke tujuan-c adalah bahwa kode yang sama TIDAK akan crash ketika string = nil. Misalnya, kode ini:

NSLog(@"does string contain string - %@", [self doesString:nil containString:@"hey"] ? @"YES": @"NO");

dan kode ini:

NSLog(@"does string contain string - %@", [self doesString:nil containString:nil] ? @"YES": @"NO");

keduanya akan menghasilkan

does string contains string - YES

Yang jelas BUKAN apa yang Anda inginkan.

Jadi solusi yang lebih baik yang saya percaya berfungsi adalah dengan menggunakan fakta bahwa rangeOfString mengembalikan panjang 0 sehingga kode yang lebih andal lebih baik adalah ini:

- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
    if(otherString && [string rangeOfString:otherString].length)
        return YES;
    else
        return NO;
}

ATAU SIMPLY:

- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
    return (otherString && [string rangeOfString:otherString].length);
}

yang akan untuk kasus 1 dan 2 akan kembali

does string contains string - NO

Itu 2 sen saya ;-)

Silakan periksa Gist saya untuk kode yang lebih bermanfaat.

ucangetit
sumber
12

Sebuah versi perbaikan dari P i 's solusi , kategori pada NSString, yang tidak hanya akan memberitahu, jika string ditemukan dalam string lain, tetapi juga mengambil berbagai dengan referensi, adalah:

@interface NSString (Contains)
-(BOOL)containsString: (NSString*)substring
              atRange:(NSRange*)range;

-(BOOL)containsString:(NSString *)substring;
@end

@implementation NSString (Contains)

-(BOOL)containsString:(NSString *)substring
              atRange:(NSRange *)range{

    NSRange r = [self rangeOfString : substring];
    BOOL found = ( r.location != NSNotFound );
    if (range != NULL) *range = r;
    return found;
}

-(BOOL)containsString:(NSString *)substring
{
    return [self containsString:substring
                        atRange:NULL];
}

@end

Gunakan seperti:

NSString *string = @"Hello, World!";

//If you only want to ensure a string contains a certain substring
if ([string containsString:@"ello" atRange:NULL]) {
    NSLog(@"YES");
}

// Or simply
if ([string containsString:@"ello"]) {
    NSLog(@"YES");
}

//If you also want to know substring's range
NSRange range;
if ([string containsString:@"ello" atRange:&range]) {
    NSLog(@"%@", NSStringFromRange(range));
}
vikingosegundo
sumber
8

Berikut ini cuplikan fungsi salin dan tempel:

-(BOOL)Contains:(NSString *)StrSearchTerm on:(NSString *)StrText
{
    return [StrText rangeOfString:StrSearchTerm 
        options:NSCaseInsensitiveSearch].location != NSNotFound;
}
Durai Amuthan.H
sumber
Bolehkah saya tahu mengapa saya tidak dipilih? Ini cuplikan kode yang berfungsi
Durai Amuthan.H
6

Oneliner (Jumlah kode yang lebih kecil. KERING, karena Anda hanya punya satu NSLog):

NSString *string = @"hello bla bla";
NSLog(@"String %@", ([string rangeOfString:@"bla"].location == NSNotFound) ? @"not found" : @"cotains bla"); 
jerik
sumber
6
NSString *categoryString = @"Holiday Event";
if([categoryString rangeOfString:@"Holiday"].location == NSNotFound)
{
    //categoryString does not contains Holiday
}
else
{
    //categoryString contains Holiday
}
Ada
sumber
5

coba ini,

NSString *string = @"test Data";
if ([[string lowercaseString] rangeOfString:@"data"].location == NSNotFound) 
{
    NSLog(@"string does not contain Data");
}   
else 
{
    NSLog(@"string contains data!");
}
Pooja Patel
sumber
5

Solusi terbaik. Sesederhana ini! Jika Anda ingin menemukan kata atau bagian dari string. Anda dapat menggunakan kode ini. Dalam contoh ini kita akan memeriksa apakah nilai kata mengandung "acter".

NSString *word =@"find a word or character here";
if ([word containsString:@"acter"]){
    NSLog(@"It contains acter");
} else {
     NSLog (@"It does not contain acter");
}
pegangan tangan
sumber
5

Dalam Swift 4:

let a = "Hello, how are you?"
a.contains("Hello")   //will return true
Ankit garg
sumber
4

Jika Anda perlu ini, sekali tulis:

NSString *stringToSearchThrough = @"-rangeOfString method finds and returns the range of the first occurrence of a given string within the receiver.";
BOOL contains = [stringToSearchThrough rangeOfString:@"occurence of a given string"].location != NSNotFound;
Nikolay Shubenkov
sumber
4

Dalam hal cepat, ini dapat digunakan

let string = "Package #23"
if string.containsString("Package #") {
    //String contains substring
}
else {
    //String does not contain substring
}
Sreedeepkesav MS
sumber
2

Jika tidak peduli tentang string case-sensitive. Coba ini sekali.

NSString *string  = @"Hello World!";

if([string rangeOfString:@"hello" options:NSCaseInsensitiveSearch].location !=NSNotFound)
{
    NSLog(@"found");
}
else
{
    NSLog(@"not found");
}
Abhijit
sumber
1

Silakan gunakan kode ini

NSString *string = @"hello bla bla";
if ([string rangeOfString:@"bla"].location == NSNotFound) 
{
    NSLog(@"string does not contain bla");
} 
else 
{  
    NSLog(@"string contains bla!");
}
Rohit suvagiya
sumber
1

Gunakan opsi NSCaseInsensitiveSearch dengan rangeOfString: options:

NSString *me = @"toBe" ;
NSString *target = @"abcdetobe" ;
NSRange range = [target  rangeOfString: me options: NSCaseInsensitiveSearch];
NSLog(@"found: %@", (range.location != NSNotFound) ? @"Yes" : @"No");
if (range.location != NSNotFound) {
// your code
}

Hasil keluaran ditemukan: Ya

Opsi dapat "ored" bersama dan termasuk:

NSCaseInsensitiveSearch NSLiteralSearch NSBackwardsSearch dan banyak lagi

Nayab Muhammad
sumber
0

String pertama mengandung atau tidak string kedua,

NSString *first = @"Banana";
NSString *second = @"BananaMilk";
NSRange range = [first rangeOfString:second options:NSCaseInsensitiveSearch];

if (range.length > 0) {
    NSLog(@"Detected");
}
else {
    NSLog(@"Not detected");
}
Kamani Jasmin
sumber
0

Coba ini:

Swift 4.1, 4.2:

let stringData = "Black board"

//swift quick way and case sensitive
if stringData.contains("bla") {
    print("data contains string");
}

//case sensitive
if stringData.range(of: "bla",options: .caseInsensitive) != nil {
    print("data contains string");
}else {
    print("data does not contains string");
}

Untuk Objective-C:

NSString *stringData = @"Black board";

//Quick way and case sensitive
if ([stringData containsString:@"bla"]) {
    NSLog(@"data contains string");
}

//Case Insensitive
if ([stringData rangeOfString:@"bla" options:NSCaseInsensitiveSearch].location != NSNotFound) {
   NSLog(@"data contains string");
}else {
   NSLog(@"data does not contain string");
}
Amir.n3t
sumber
0

Swift 4 Dan Di Atas

let str = "Hello iam midhun"

if str.contains("iam") {
  //contains substring
}
else {
  //doesn't contain substring
}

Objektif-C

NSString *stringData = @"Hello iam midhun";

if ([stringData containsString:@"iam"]) {
    //contains substring
}
else {
    //doesn't contain substring
}
midhun p
sumber
-1
-(Bool)checkIf:(String)parentString containsSubstring:(String)checkString {
    NSRange textRange =[parentString rangeOfString:checkString];
    return textRange.location != NSNotFound // returns true if parent string contains substring else returns false
  }
iOS Nepal
sumber
1
Di Objective-C kita memiliki tipe 'NSString`. Kami tidak memiliki Stringtipe. Kedua, kita memiliki semua benda. Jadi sebagai argumen Anda harus lulus NSString. Saya memilih penghapusan karena kualitas jawaban yang buruk di bawah pertanyaan yang sangat aktif.
Aleksey Potapov
-2

Jika posisi string tertentu diperlukan, kode ini muncul di Swift 3.0 :

let string = "This is my string"
let substring = "my"

let position = string.range(of: substring)?.lowerBound
pedrouan
sumber