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


1212

文字列(NSString)に別の小さい文字列が含まれているかどうかを確認するにはどうすればよいですか?

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

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

しかし、私が見つけることができる最も近いものは次のとおりです。

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

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


1
それも追加したいのですが、当面はNSStringのカテゴリとして追加するのは比較的簡単です。
isaac 2013年

2
使用if ([string rangeOfString:@"hello"] == 0) {...}NSRangeとint型のための型の不一致エラーがあります。あなたは、次の行を変更する必要があり、修正する:if ([string rangeOfString:@"hello"].length == 0) {...}
Neeku

1
iOS 8はcontainsString:を追加します。これは、iOS 7のサポートを追加するための最小限の侵略的な方法です。petersteinberger.com/ blog / 2014 /…
Steve Moser

2
私は最初からiOS開発者であり、簡単なコピーペーストのためにこの投稿を常に再訪しています。これは覚えられないようです。私の歴史の中で最も訪問されたstackoverflowの投稿。
VaporwareWolf 2016年

Swiftを使用してください;)
Fattie

回答:


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

キーは構造体をrangeOfString:返すことに気づいてNSRangeおり、ドキュメントでは{NSNotFound, 0}、「haystack」に「needle」が含まれていない場合、構造体を返すと記載されています。


また、iOS 8またはOS X Yosemiteを使用している場合は、次のことを実行できます(*注:このコードがiOS7デバイスで呼び出されると、アプリがクラッシュします)。

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

(これはSwiftでの動作方法でもあります)

👍


286
大文字と小文字を区別しない検索を行うには、「if([string rangeOfString:@ "bla" options:NSCaseInsensitiveSearch] .location!= NSNotFound)」を使用します
VANJA

1
@Dave DeLong回答の編集内容を読む前に、この目的のために作成したカテゴリについて説明しました。私は主にAC#開発者なので、NSSTringにcontainsメソッドが追加されたことをうれしく思います。
dherrin79 2014

展開ターゲットがiOS7で、containsStringを使用している場合、コンパイラーが何も言わないのはなぜですか?
Ricardo

3
そして、@ Vanjaによって指摘された点をさらに進めるために、iOS 8 / Yosemiteで導入された[string containsString]ショートカットコードを使用する場合は、大文字と小文字を区別しない文字列に次のコードを使用できます: "[stringToSearch ] "、および大文字と小文字を区別せずに検索する場合は、" [stringToSearch LocalizedStandardContainsString:string] "。
Scott Kohlert 2016年

1
stringが!の場合、式[string rangeOfString:@"bla"].location != NSNotFoundtrueになることに注意してくださいnil
funroll 2016年

158

iOS 8.0以降およびmacOS 10.10以降の場合、NSStringのネイティブを使用できますcontainsString:

古いバージョンのiOSおよびmacOSの場合、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

注:命名に関する以下のDaniel Galaskoのコメントに注意してください


13
結果のコードと再利用性を明確にするために+1。私はそれを1つのライナーreturn [self rangeOfString:substring].location != NSNotFound;にして、リファクタリングライブラリes_ios_utilsに含めました。github.com/peterdeweese/es_ios_utils
Peter DeWeese

4
Appleがあなたのアイデアを気に入っているようで、この機能をiOS 8とOSx 10.10(Yosemite)に追加しました。@ DaveDeLongが彼の回答で述べたとおりです。+1
Islam Q.

7
obj-cカテゴリの基本的なルールは、メソッド名の前に3文字のモジュールプレフィックスを付けることです。これは、iOS 7および10.10リリースと競合するため、完璧な例です
Daniel Galasko

54

これはGoogleでの上位の結果のようですので、これを追加します。

iOS 8およびOS X 10.10では、containsString:メソッドがに追加されNSStringます。これらのシステムに対するDave DeLongの例の更新版:

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

//代わりに以下も使用できます:

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

22

iOSの8スウィフト、我々は使用することができますlocalizedCaseInsensitiveContainsString 方法を

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

 string.localizedCaseInsensitiveContainsString(substring) // true

1
これはいい。iOS 7でこの方法がなかった理由はわかりません
Lucas

@ Lucas、SwiftはiOS 8.0で起動したため。しかし、
Swift

13

個人的には嫌いです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を確認してください。


12

NSStringのカテゴリである、P iのソリューションの改良版は、文字列が別の文字列内で見つかった場合に通知するだけでなく、参照によって範囲も取得するものです。

@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

次のように使用します。

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

これは、コピーアンドペースト機能のスニペットです。

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

なぜ私が反対票を投じられているのか知っていますか?これは実用的なコードスニペットです
Durai Amuthan.H 2015

6

Oneliner(コードの量が少ない。DRY、1つしかないため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

これを試して、

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

5

最良のソリューション。これと同じくらい簡単です!単語または文字列の一部を検索する場合。このコードを使用できます。この例では、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");
}


4

これが必要な場合は、次のように記述します。

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

迅速な場合、これは使用できます

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

2

大文字と小文字を区別する文字列を気にしないでください。これを一度試してください。

NSString *string  = @"Hello World!";

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

1

このコードを使用してください

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

1

オプションNSCaseInsensitiveSearchと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
}

出力結果が見つかりました:はい

オプションは一緒に「または」することができ、次のものが含まれます。

NSCaseInsensitiveSearch NSLiteralSearch NSBackwardsSearchなど


0

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

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

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

0

これを試して:

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

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

0

Swift 4以降

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には 'NSString`タイプがあります。Stringタイプはありません。次に、すべてのオブジェクトがあります。したがって、引数として渡す必要がありNSStringます。非常に活発な質問での回答の質が低いため、削除に投票します。
Aleksey Potapov

-2

文字列の特定の位置が必要な場合、このコードはSwift 3.0に配置されます。

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

let position = string.range(of: substring)?.lowerBound
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.