[ios] Objective-C에서 문자열에 다른 문자열이 포함되어 있는지 어떻게 확인합니까?

문자열 ( NSString)에 다른 작은 문자열이 포함되어 있는지 어떻게 확인할 수 있습니까?

나는 다음과 같은 것을 바랐다.

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

그러나 내가 찾을 수있는 가장 가까운 것은 다음과 같습니다.

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

어쨌든 문자열에 다른 문자열이 있는지 찾는 가장 좋은 방법입니까?



답변

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

키는 구조체 를 rangeOfString:반환하는 것을 알 수 있으며 설명서 에는 “haystack”에 “needle”이 포함되어 있지 않으면 구조체를 반환 한다고 합니다 .NSRange{NSNotFound, 0}


그리고 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에서도 작동하는 방식입니다)

👍


답변

iOS 8.0 이상 및 macOS 10.10 이상에서는 NSString의 native를 사용할 수 있습니다 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의 의견을 준수하십시오.


답변

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


답변

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


답변

함께 아이폰 OS 8스위프트 , 우리가 사용할 수있는 localizedCaseInsensitiveContainsString 방법을

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

 string.localizedCaseInsensitiveContainsString(substring) // true


답변

그래서 개인적으로 나는 정말 미워 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 센트입니다. 😉

더 유용한 코드는 내 요지 를 확인하십시오 .


답변

NSString의 범주 인 Pi 솔루션 의 개선 된 버전은 문자열이 다른 문자열에서 발견 될 때뿐만 아니라 참조로 범위를 취하는 경우에 다음과 같이 표시됩니다.

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