NSStringに含まれるかどうかを検出しています…


124

文字列に特定の単語が含まれているかどうかをどのように検出できますか?たとえば、以下の文字列があります。

@"Here is my string."

「is」など、文字列内の単語を検出できるかどうか知りたいのですが。



26
答えを受け入れることができますか?
Jacob Relkin、2010

文字列に句読点が含まれていないと想定される場合、安くて汚い解決策は、両方の文字列の前後に空白を連結することですrangeOfString
Hot Licks

回答:


192

ここに私がそれをする方法があります:

NSString *someString = @"Here is my string";
NSRange isRange = [someString rangeOfString:@"is " options:NSCaseInsensitiveSearch];
if(isRange.location == 0) {
   //found it...
} else {
   NSRange isSpacedRange = [someString rangeOfString:@" is " options:NSCaseInsensitiveSearch];
   if(isSpacedRange.location != NSNotFound) {
      //found it...
   }
}

これをカテゴリとして簡単に追加できますNSString

@interface NSString (JRStringAdditions) 

- (BOOL)containsString:(NSString *)string;
- (BOOL)containsString:(NSString *)string
               options:(NSStringCompareOptions)options;

@end

@implementation NSString (JRStringAdditions) 

- (BOOL)containsString:(NSString *)string
               options:(NSStringCompareOptions)options {
   NSRange rng = [self rangeOfString:string options:options];
   return rng.location != NSNotFound;
}

- (BOOL)containsString:(NSString *)string {
   return [self containsString:string options:0];
}

@end

2
実際には、文字列の最初と最後にスペースを追加するだけで、 "is"は "is"で始まる文字列に一致します
user4951

これらは標準クラスの一部ではないことに私は気が遠くなります。ありがとう、@ Jacob!
big_m 2013

1
実際には、NSRangeの「長さ」をテストする必要があります...「場所」ではありません。ここでは、ソースから直接取得しています:「これらのメソッドは、ターゲット文字列が見つからない場合、length == 0を返します。したがって、包含を確認するには:([ str rangeOfString:@ "target"]。length> 0)。合成文字などにより、これらのメソッドによって返される範囲の長さは、ターゲット文字列の長さと異なる場合があることに注意してください。
GtotheB 2014

iOS 8.0以降、containsStringNSStringで公開されたと呼ばれる新しいメソッドがあります。
tedyyu 2014年

89

次のコードを使用して、文章内の単語をスキャンします。

NSString *sentence = @"The quick brown fox";
NSString *word = @"quack";
if ([sentence rangeOfString:word].location != NSNotFound) {
    NSLog(@"Yes it does contain that word");
}

配列でこのメソッドを使用するときに位置を取得するにはどうすればよいですか?
裁判官

配列内で検索を使用する対象によって異なります。コンパレーターを使用しない場合は、配列をループして検索文字列の各文字列を確認するのが最善の方法だと思います。NSString * searchString; for(NSString * string in array){if([string rangeOfString:searchString options:NSCaseInsensitiveSearch] .location!= NSNotFound){// Not in string} else {// In this string}}次に、次の文字列を追加できます新しい可変配列に格納して、検索している場合に表示できるようにします
simon_smiley 2014年

ps上記のコードではフォーマットはすべて正しいですが、コメントに含まれていることで明らかにマッシュ
アップ

22

iOS8では、次を使用できます。

BOOL containsString = [@"Here is my string." containsString:@"is"];

どのようにここでiOS7に「改造」それまでに興味深い記事があります: http://petersteinberger.com/blog/2014/retrofitting-containsstring-on-ios-7/


とても便利で便利な方法でしょう。残念ながら、それは文書化されていないため、プライベートAPIです
Centurion

2
それは間違いなくプライベートAPIではありません。NSString.hファイルをチェックアウトすると、それが表示されます。
Brian Sachetta 2015年

3

NSLinguisticTaggerの使用をお勧めします。検索に使用できますHere is my string. His isn't a mississippi isthmus. It is?

NSLinguisticTagger *linguisticTagger = [[NSLinguisticTagger alloc] initWithTagSchemes:@[
                                        NSLinguisticTagSchemeTokenType,
                                        ]
                                                                              options:
                                        NSLinguisticTaggerOmitPunctuation |
                                        NSLinguisticTaggerOmitWhitespace |
                                        NSLinguisticTaggerOmitOther ];
[linguisticTagger setString:@"Here is my string. His isn't a mississippi isthmus. It is?"];
[linguisticTagger enumerateTagsInRange:NSMakeRange(0,
                                                   [[linguisticTagger string] length])
                                scheme:NSLinguisticTagSchemeTokenType
                               options:
 NSLinguisticTaggerOmitPunctuation |
 NSLinguisticTaggerOmitWhitespace |
 NSLinguisticTaggerOmitOther |
 NSLinguisticTaggerJoinNames
                            usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop) {
                                NSLog(@"tag: %@, tokenRange: %@, sentenceRange: %@, token: %@",
                                      tag,
                                      NSStringFromRange(tokenRange),
                                      NSStringFromRange(sentenceRange),
                                      [[linguisticTagger string] substringWithRange:tokenRange]);
                            }];

これは出力します:

tag: Word, tokenRange: {0, 4}, sentenceRange: {0, 19}, token: Here
tag: Word, tokenRange: {5, 2}, sentenceRange: {0, 19}, token: is
tag: Word, tokenRange: {8, 2}, sentenceRange: {0, 19}, token: my
tag: Word, tokenRange: {11, 6}, sentenceRange: {0, 19}, token: string
tag: Word, tokenRange: {19, 3}, sentenceRange: {19, 33}, token: His
tag: Word, tokenRange: {23, 2}, sentenceRange: {19, 33}, token: is
tag: Word, tokenRange: {25, 3}, sentenceRange: {19, 33}, token: n't
tag: Word, tokenRange: {29, 1}, sentenceRange: {19, 33}, token: a
tag: Word, tokenRange: {31, 11}, sentenceRange: {19, 33}, token: mississippi
tag: Word, tokenRange: {43, 7}, sentenceRange: {19, 33}, token: isthmus
tag: Word, tokenRange: {52, 2}, sentenceRange: {52, 6}, token: It
tag: Word, tokenRange: {55, 2}, sentenceRange: {52, 6}, token: is

を無視His mississippiisthmus、さらにはのis内部を識別しisn'tます。


3

これがお役に立てば幸いです。この行を.mファイルに追加するか、別のクラスを作成してこのコードを統合します。

@implementation NSString (Contains)

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

2

iOS 8とSwiftでは、localizedCaseInsensitiveContainsStringメソッドを使用できます

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

 string.localizedCaseInsensitiveContainsString(substring) // true

0

完全なソリューションでは、最初に文字列をスキャンし(空白を追加しないで)、次に直前の文字が空白か行の先頭かを確認します。同様に、直後の文字が空白か行末かを確認します。両方のテストに合格すると、一致します。あなたのニーズに応じて、あなたもかどうかを確認可能性がある,.()、など

もちろん、代替のアプローチは、文字列を単語に解析し、各単語を個別にチェックすることです。

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