[Ios] Objective-Cで文字列に別の文字列が含まれているかどうかを確認するにはどうすればよいですか?


Answers

注:この回答は廃止されました。

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

編集:ダニエルGalaskoさんの名前を以下のコメントに観察する

Question

文字列( NSString )に別の小さな文字列が含まれているかどうかを確認する方法はありますか?

私は次のようなものを望んでいた:

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

しかし、私が見つけた最も近いものは、

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

とにかく、文字列に別の文字列が含まれているかどうかを調べる最良の方法ですか?




個人的に私は本当にNSNotFoundが嫌いNSNotFoundが、その必要性を理解しています。

しかし、NSNotFoundとの比較の複雑さを理解していない人もいるかもしれません

たとえば、次のコード:

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

その問題があります:

1)明らかにotherString = nilならこのコードはクラッシュします。 簡単なテストは次のようになります。

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

結果は!! クラッシュ!

2)objective-cの新しい人にとってあまり明らかでないことは、 string = nilときに同じコードがクラッシュしないということです。 たとえば、次のコード:

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

とこのコード:

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

両方とも

does string contains string - YES

あなたが望むものとは明らかに異なるものです。

したがって、私がうまくいくと思う解決策は、rangeOfStringが長さ0を返すという事実を利用することです。そうすればより信頼性の高いコードが得られます。

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

または単純に:

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

ケース1と2の場合は返されます

does string contains string - NO

それは私の2セントです;-)

もっと役に立つコードについては、私のGistをチェックしてください。




最初の文字列に2番目の文字列が含まれるかどうか、

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

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



これを一度書いておく必要がある場合は、

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;



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

//代わりに次のように使うこともできます:

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



コピー&ペースト機能のスニペットは次のとおりです。

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



ベストソリューション。 これほど簡単! 単語や文字列の一部を探したい場合。 このコードを使用することができます。 この例では、wordの値に "acter"が含まれているかどうかを確認します。

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



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



スイフト4:

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