Bir dizenin Objective-C içinde başka bir dize içerip içermediğini nasıl kontrol edebilirim?


1212

Bir dizginin ( NSString) başka bir küçük dize içerip içermediğini nasıl kontrol edebilirim ?

Gibi bir şey umuyordum:

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

Ama bulabildiğim en yakın şey:

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

Her neyse, bir dize başka bir dize içerip içermediğini bulmanın en iyi yolu bu mu?


1
Ben de eklendi görmek istiyorum, ama bu arada NSString bir kategori olarak eklemek nispeten kolaydır.
— Isaac

2
Kullanılması if ([string rangeOfString:@"hello"] == 0) {...}NSRange ve int için bir tür uyumsuzluğu hatası var. Bunu düzeltmek için hattı şu şekilde değiştirmelisiniz:if ([string rangeOfString:@"hello"].length == 0) {...}
— Neeku

1
iOS 8 containsString ekler: burada iOS 7 desteği eklemek için minimal invaziv bir yoldur petersteinberger.com/blog/2014/...
— Steve Moser

2
Başından beri iOS geliştiricisiyim ve hızlı bir şekilde yapıştırmak için bu gönderiyi sürekli tekrar ziyaret ediyorum. Bunu ezberleyemiyorum. Geçmişimde en çok ziyaret edilen stackoverflow yayını.
— VaporwareWolf

sadece Swift kullanın;)
— Fattie

Yanıtlar:


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

Anahtar, rangeOfString:bir NSRangeyapı döndürdüğünü fark eder ve belgeler{NSNotFound, 0} , "samanlık" "iğne" içermiyorsa, yapıyı döndürdüğünü belirtir .


İOS 8 veya OS X Yosemite kullanıyorsanız, artık şunları yapabilirsiniz: (* NOT: Bu kod bir iOS7 cihazında çağrılırsa, bu uygulamanızı kilitler).

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

(Swift'te de böyle çalışacaktı)

👍


286
Büyük / küçük harfe duyarlı olmayan bir arama yapmak için "if ([string rangeOfString: @" bla "seçenekleri: NSCaseInsensitiveSearch] .location! = NSNotFound)" kullanın
— Vanja

1
@Dave DeLong Cevaba düzenlemenizi okumadan önce bu amaçla oluşturduğum bir Kategoriden bahsedeceğim! Öncelikle ac # geliştiricisi olduğum için NSSTring'e bir içerme yöntemi eklediğine sevindim.
— dherrin79

Dağıtım hedefim iOS7 ise ve derleyici içerdiğimde neden derleyici bir şey söylemiyor?
— Ricardo

3
Ve @Vanja tarafından yapılan noktayı daha da ileriye taşımak için: iOS 8 / Yosemite'de tanıtılan [string includeString] kısayol kodunu kullanacaksanız, büyük / küçük harfe duyarlı olmayan bir dize için aşağıdaki kodu kullanabilirsiniz: "[stringToSearch localizedCaseInsensitiveContainsString: string ] "ve bunu bir vaka ve aksan duyarlı olmayan arama yapmak istiyorsanız:" [stringToSearch localizedStandardContainsString: string] ".
— Scott Kohlert

1
Dize olduğunda ifadenin doğru[string rangeOfString:@"bla"].location != NSNotFound olacağını unutmayın ! nil
— funroll

158

İOS 8.0+ ve macOS 10.10+ için NSString'in doğal sürümünü kullanabilirsiniz containsString:.

İOS ve macOS'un daha eski sürümleri için NSString için kendi (eski) kategorinizi oluşturabilirsiniz:

@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

Not: Daniel Galasko'nun aşağıdaki adlandırma hakkındaki yorumunu izleyin


13
Daha net sonuç kodu ve yeniden kullanılabilirlik için +1. Bir astar haline getirdim return [self rangeOfString:substring].location != NSNotFound;ve yeniden düzenleme kütüphaneme, es_ios_utils'e dahil ettim. github.com/peterdeweese/es_ios_utils
— Peter DeWeese

4
Apple fikrinizi seviyor ve bu özelliği iOS 8 ve OSx 10.10'da (Yosemite) cevabında @DaveDeLong'un belirttiği gibi ekledi. +1
— İslam S.

7
Obj-c kategorileri için temel kural, yöntem adının önüne 3 harfli modül önekini eklemektir. Bu, iOS 7 ve 10.10 sürümüyle çakıştığı için mükemmel bir örnek
— Daniel Galasko

54

Bu Google'da üst düzey bir sonuç gibi göründüğünden, bunu eklemek istiyorum:

iOS 8 ve OS X 10.10 containsString:yöntemi ekler NSString. Bu sistemler için Dave DeLong örneğinin güncellenmiş bir sürümü:

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

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!");
}

// Alternatif olarak aşağıdakileri de kullanabilirsiniz:

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

22

İle iOS 8 ve Swift , biz kullanabilirsiniz localizedCaseInsensitiveContainsString yöntem

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

 string.localizedCaseInsensitiveContainsString(substring) // true

1
Bu iyi. Neden ios 7 için bu yönteme sahip olmadıklarını bilmiyorum
— Lucas

@Lucas, çünkü Swift iOS 8.0 ile başlattı. ancak hızlı bir şekilde cihazları iOS 7 ile desteklemeye devam edebilirsiniz.
— Hemang

13

Şahsen nefret ediyorum NSNotFoundama gerekliliğini anlıyorum.

Ancak bazı insanlar NSNotFound ile karşılaştırmanın karmaşıklığını anlamayabilir

Örneğin, bu kod:

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

sorunları var:

1) Açıkçası otherString = nilbu kod çökerse. basit bir test:

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

sonuçları !! KAZA !!

2) objektif-c'de yeni olan biri için bu kadar belirgin olmayan şey, aynı kodun ne zaman çökmeyeceği string = nil. Örneğin, bu kod:

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

ve bu kod:

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

ikisi de sonuçlanacak

does string contains string - YES

Hangi açıkça ne istediğinizi DEĞİLDİR.

Bu yüzden çalışır inanıyorum daha iyi bir çözüm, o zaman daha iyi, daha güvenilir bir kod bu rangeOfString 0 uzunluğu döndürüyor gerçeğini kullanmaktır:

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

YA DA SADECE:

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

1 ve 2 numaralı davalar için geri dönecek

does string contains string - NO

Bu benim 2 sentim ;-)

Daha yararlı kod için lütfen Gist'ime göz atın .


12

P i'nin çözümünün geliştirilmiş bir sürümü olan NSString kategorisi, sadece bir dize başka bir dize içinde bulunursa, aynı zamanda referans olarak bir aralık alırsa da söyleyecek bir kategori değildir:

@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

Gibi kullanın:

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));
}

8

İşte bir kopyala ve yapıştır işlevi snippet'i:

-(BOOL)Contains:(NSString *)StrSearchTerm on:(NSString *)StrText
{
    return [StrText rangeOfString:StrSearchTerm 
        options:NSCaseInsensitiveSearch].location != NSNotFound;
}

Neden indirildiğimi öğrenebilir miyim? Bu bir çalışma kodu pasajı
— Durai Amuthan.H

6

Oneliner (Daha az kod. DRY, sadece bir tane var gibi NSLog):

NSString *string = @"hello bla bla";
NSLog(@"String %@", ([string rangeOfString:@"bla"].location == NSNotFound) ? @"not found" : @"cotains bla"); 

6
NSString *categoryString = @"Holiday Event";
if([categoryString rangeOfString:@"Holiday"].location == NSNotFound)
{
    //categoryString does not contains Holiday
}
else
{
    //categoryString contains Holiday
}

5

bunu dene,

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

5

En iyi çözüm. Bu kadar basit! Bir kelimeyi veya dizenin bir bölümünü bulmak istiyorsanız. Bu kodu kullanabilirsiniz. Bu örnekte, kelime değerinin "acter" içerip içermediğini kontrol edeceğiz.

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

5

Swift 4'te:

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

4

Buna bir kez ihtiyacınız varsa yazın:

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;

4

Hızlı olması durumunda, bu kullanılabilir

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

2

Büyük / küçük harf duyarlı dize hakkında rahatsız etmeyin. Bunu bir kez deneyin.

NSString *string  = @"Hello World!";

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

1

Lütfen bu kodu kullanın

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

1

RangeOfString: options ile NSCaseInsensitiveSearch seçeneğini kullanın:

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
}

Çıktı sonucu bulundu: Evet

Seçenekler birlikte "veya" eklenebilir ve şunları içerebilir:

NSCaseInsensitiveSearch NSLiteralSearch NSBackwardsSearch ve daha fazlası


0

İlk dize, ikinci dize içerir veya içermez,

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

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

0

Bunu dene:

Hızlı 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");
}

Objective-C için:

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");
}

0

Swift 4 ve Üzeri

let str = "Hello iam midhun"

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

Objective-C

NSString *stringData = @"Hello iam midhun";

if ([stringData containsString:@"iam"]) {
    //contains substring
}
else {
    //doesn't contain substring
}

-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
  }

1
Objective-C'de 'NSString` tipine sahibiz. Türümüz yok String. İkincisi, tüm nesneler var. Yani bir argüman olarak geçmelisin NSString. Oldukça aktif bir soru altında bir cevabın kalitesinin düşük olması nedeniyle silinmeye oy veriyorum.
— Aleksey Potapov

-2

Dizenin belirli bir konumu gerekiyorsa, bu kod Swift 3.0'a yerleştirilir :

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

let position = string.range(of: substring)?.lowerBound
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.