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.