NSString의 하위 문자열을 얻는 방법?


78

NSString에서 값을 얻으려면 @"value:hello World:value"무엇을 사용해야합니까?

내가 원하는 반환 값은 @"hello World"입니다.



나는 당신의 질문이 무엇인지 명확하지 않기 때문에이 질문을 종결하기 위해 투표하고 있습니다. 여기에서 원하는 것이 정확히 무엇인지 전혀 알 수 없습니다. 그냥 돌아가 "hello World"시겠습니까? return @"hello World". 콜론 사이에있는 것만 반환 하시겠습니까? 가장 왼쪽 콜론의 왼쪽과 맨 오른쪽 콜론의 모든 것을 제거 하시겠습니까? 이 질문에 대해 명확하게 정의 된 입력-출력 기준은 없습니다 (모두 광범위한 접근 방식으로 문제를 해결하는 결과 질문 목록에서 볼 수 있듯이).
nhgrif

답변:


158

옵션 1:

NSString *haystack = @"value:hello World:value";
NSString *haystackPrefix = @"value:";
NSString *haystackSuffix = @":value";
NSRange needleRange = NSMakeRange(haystackPrefix.length,
                                  haystack.length - haystackPrefix.length - haystackSuffix.length);
NSString *needle = [haystack substringWithRange:needleRange];
NSLog(@"needle: %@", needle); // -> "hello World"

옵션 2 :

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^value:(.+?):value$" options:0 error:nil];
NSTextCheckingResult *match = [regex firstMatchInString:haystack options:NSAnchoredSearch range:NSMakeRange(0, haystack.length)];
NSRange needleRange = [match rangeAtIndex: 1];
NSString *needle = [haystack substringWithRange:needleRange];

이것은 당신의 다소 사소한 경우에 대해 약간 넘어 설 수 있습니다.

옵션 3 :

NSString *needle = [haystack componentsSeparatedByString:@":"][1];

이것은 분할하는 동안 세 개의 임시 문자열과 배열을 만듭니다.


모든 스 니펫은 검색된 내용이 실제로 문자열에 포함되어 있다고 가정합니다.


NSAnchoredSearch에서 울었습니다 ... 어쩌면 NSMatchingAnchored가 더 낫습니다.
조니

74

다음은 약간 덜 복잡한 대답입니다.

NSString *myString = @"abcdefg";
NSString *mySmallerString = [myString substringToIndex:4];

substringWithRange 및 substringFromIndex도 참조하십시오.


1
죄송합니다. 이것은 질문에 대한 답변이 아닙니다 (문자열 중간에서 부분 문자열을 얻는 방법).
Monolo

돌려 무엇
Chicowitz

17

다음은 원하는 작업을 수행 할 수있는 간단한 기능입니다.

- (NSString *)getSubstring:(NSString *)value betweenString:(NSString *)separator
{
    NSRange firstInstance = [value rangeOfString:separator];
    NSRange secondInstance = [[value substringFromIndex:firstInstance.location + firstInstance.length] rangeOfString:separator];
    NSRange finalRange = NSMakeRange(firstInstance.location + separator.length, secondInstance.location);

    return [value substringWithRange:finalRange];
}

용법:

NSString *myName = [self getSubstring:@"This is my :name:, woo!!" betweenString:@":"];

1
불이 들어 오면 다른 답변에 투표 한 이유를 알려 드릴 수 있습니다. 6 줄보다는 2 줄의 코드를 작성하는 편이 낫습니다.
Le Mot Juiced 2013

2
문제는이 두 줄의 코드가 누구에게도 존재하지 않을 특정 사례 만 해결한다는 것입니다.
Garett

getSubstring:…substringInString:…하위 문자열을 전달하지 않고로 시작하는 메서드 get…는 일반적으로 쓸 버퍼 포인터가 전달 될 것으로 예상 되므로 호출해야합니다 . substringFromIndex:불필요한 중간 부분 문자열을 생성합니다 rangeOfString:options:range:. 마지막으로 안전하지 않은 스 니펫을 일반적인 메서드로 래핑하여 버그를 마스킹합니다. 구분자가 문자열에 한 번 이하로 존재하면 범위를 벗어난 예외가 발생합니다.
Regexident

14

이것도 사용

NSString *ChkStr = [MyString substringWithRange:NSMakeRange(5, 26)];

참고-귀하 NSMakeRange(start, end)는이어야합니다 NSMakeRange(start, end- start).


12

다음은 @Regexident Option 1과 @Garett 답변의 작은 조합으로 접두사와 접미사 사이에 MORE ... ANDMORE 단어가있는 강력한 문자열 커터를 얻을 수 있습니다.

NSString *haystack = @"MOREvalue:hello World:valueANDMORE";
NSString *prefix = @"value:";
NSString *suffix = @":value";
NSRange prefixRange = [haystack rangeOfString:prefix];
NSRange suffixRange = [[haystack substringFromIndex:prefixRange.location+prefixRange.length] rangeOfString:suffix];
NSRange needleRange = NSMakeRange(prefixRange.location+prefix.length, suffixRange.location);
NSString *needle = [haystack substringWithRange:needleRange];
NSLog(@"needle: %@", needle);

이제 작동합니다! Regixident의 옵션 1을 시도했지만 작동하지 않았습니다. 왜 그런지 모르겠어요. <i></i>내 프로젝트 의 태그 안에 문자열을 가져와 해당 문자열을 기울임 꼴로 만드는 솔루션을 찾고 있습니다. :)
Glenn Posadas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.