문자열 ( 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));
}