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

2
사용 if ([string rangeOfString:@"hello"] == 0) {...}NSRange 및 인터넷 용 형식 불일치 오류가 있습니다. 문제를 해결하려면 줄을 다음과 같이 변경해야합니다.if ([string rangeOfString:@"hello"].length == 0) {...}
Neeku

1
iOS 8에 containsString 추가 : 여기에 iOS 7 지원을 추가하는 최소 침략적 방법이 있습니다 petersteinberger.com/blog/2014/…
Steve Moser

2
나는 처음부터 iOS 개발자였으며 ​​빠른 복사 붙여 넣기를 위해이 게시물을 계속 다시 방문합니다. 나는 이것을 기억하지 못하는 것 같습니다. 내 역사상 가장 많이 방문한 stackoverflow 게시물.
VaporwareWolf

그냥 스위프트를 사용;)
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:반환하는 것을 알 수 있으며 설명서 에는 "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에서도 작동하는 방식입니다)

👍


286
대소 문자를 구분하지 않는 검색을하려면 "if ([string rangeOfString : @"bla "옵션 : NSCaseInsensitiveSearch] .location! = NSNotFound)"
Vanja

1
@Dave DeLong 나는 대답에 대한 편집 내용을 읽기 전에이 목적을 위해 만든 범주를 언급하려고했습니다! 나는 주로 AC # 개발자이기 때문에 NSSTring에 contains 메소드를 추가하게되어 기쁩니다.
dherrin79

배포 대상이 iOS7이고 containsString을 사용하는 경우 컴파일러에서 아무 말도하지 않는 이유는 무엇입니까?
Ricardo

3
그리고 @Vanja의 요점을 더 자세히 설명하자면 : iOS 8 / Yosemite에서 소개 된 [string containsString] 단축 코드를 사용하려는 경우 대소 문자를 구분하지 않는 문자열에 다음 코드를 사용할 수 있습니다. "[stringToSearch localizedCaseInsensitiveContainsString : string ] "를 입력하고 대소 문자를 구분하지 않고 분음 부호를 사용하지 않으려면"[stringToSearch localizedStandardContainsString : string] "입니다.
Scott Kohlert

1
string이 ! 이면 표현식 [string rangeOfString:@"bla"].location != NSNotFound참이 됩니다 nil.
funroll

158

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의 의견을 준수하십시오.


13
보다 명확한 결과 코드 및 재사용 성을 위해 +1 나는 이것을 하나의 라이너로 바꾸어 return [self rangeOfString:substring].location != NSNotFound;리팩토링 라이브러리 es_ios_utils에 포함시켰다. github.com/peterdeweese/es_ios_utils
Peter DeWeese

4
Apple이 귀하의 아이디어를 좋아하고 @DaveDeLong이 그의 답변에서 언급 한 것처럼 iOS 8 및 OSx 10.10 (Yosemite) 에서이 기능을 추가 한 것 같습니다. +1
이슬람 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

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

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

 string.localizedCaseInsensitiveContainsString(substring) // true

1
이거 좋다 왜 그들이 iOS 7에이 방법을 갖지 않았는지 모르겠다
Lucas

Swift가 iOS 8.0에서 시작 되었기 때문에 @Lucas. 그러나 신속하게 iOS 7을 사용하는 장치를 계속 지원할 수 있습니다.
Hemang

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 센트입니다. ;-)

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


12

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

8

복사하여 붙여 넣기 기능 스 니펫은 다음과 같습니다.

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

내가 왜 다운 보트인지 알 수 있습니까? 작동하는 코드 스 니펫
Durai Amuthan. H

6

Oneliner (작은 양의 코드. 하나만 있으므로 DRY 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");
}

5

스위프트 4에서 :

let a = "Hello, how are you?"
a.contains("Hello")   //will return true

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

rangeOfString : options와 함께 NSCaseInsensitiveSearch 옵션을 사용하십시오.

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

첫 번째 문자열은 두 번째 문자열을 포함하거나 포함하지 않습니다.

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

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

0

이 시도:

스위프트 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

스위프트 4 이상

let str = "Hello iam midhun"

if str.contains("iam") {
  //contains substring
}
else {
  //doesn't contain substring
}

목표 -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.