NSString에 포함되어 있는지 감지 중…?


124

문자열에 특정 단어가 포함되어 있는지 어떻게 감지 할 수 있습니까? 예를 들어, 다음과 같은 문자열이 있습니다.

@"Here is my string."

예를 들어 "is"와 같은 문자열에서 단어를 감지 할 수 있는지 알고 싶습니다.



26
대답을 받아 들일 수 있습니까?
Jacob Relkin

저렴하고 더러운 솔루션은 문자열에 구두점이 포함되어 있다고 가정하면 두 문자열의 앞뒤에 공백을 연결 한 다음 수행하는 것 rangeOfString입니다.
Hot Licks 2013 년

답변:


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 jul.

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

추신 형식은 위의 코드에서 올바른하지만 분명히 코멘트에있는에 의해 반하게됩니다 전부입니다
simon_smiley

22

이제 iOS8에서 다음을 사용할 수 있습니다.

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

여기에 iOS7에 "개장"하는 방법에 대한 흥미로운 게시물이 있습니다. http://petersteinberger.com/blog/2014/retrofitting-containsstring-on-ios-7/


매우 편리한 방법이 될 것입니다. 안타깝게도 문서화되지 않았으므로 비공개 API입니다
Centurion 2015

2
확실히 개인 API가 아닙니다. NSString.h 파일을 확인하면 볼 수 있습니다.
Brian Sachetta

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 mississippi하고 isthmus심지어 식별 합니다.isisn'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.