Searching, Comparing, and Sorting Strings

OSXDEV

Jump to: navigation, 찾기

스트링 클래스들은 스트링간의 비교를 위해 캐릭터 및 서브스트링 찾기 메소드를 제공합니다. 이들 메소드는 Unicode 표준을 준수하여 두 캐릭터 시퀀스가 동등한지 여부를 결정합니다. 스트링 클래스는 합쳐진 캐릭터 시퀀스를 적절히 처리하는 비교 메소드를 제공하지만, 효율이 중요하고 합쳐진 캐릭터 시퀀스가 정규 형태를 띄고 있다는 것을 보장할 수 잇는 경우라면 리터럴 검색을 옵션으로 지정할 수 있습니다.


목차

[편집] Search and Comparison Methods

검색 및 비교 메소드는 몇몇 변형들을 가지고 잇습니다. 가장 단순한 버전은 전체 스트링을 검색하거나 비교합니다. 다른 변형들은 합쳐진 캐릭터 시퀀스의 비교가 수행되는 방식을 변경할 수 있도록 하며 검색되거나 비교될 스트링 내의 캐릭터 범위를 지정할 수 있도록 해줍니다. 또한 주어진 지역의 컨텍스트에서 스트링을 검색하고 비교할 수 있습니다.

다음 표는 기본 검색 및 비교 메소드 입니다.


검색 메소드 비교 메소드
rangeOfString: compare:
rangeOfString:options: compare:options:
rangeOfString:options:range: compare:options:range:
rangeOfString:options:range:locale: compare:options:range:locale:
rangeOfCharacterFromSet:
rangeOfCharacterFromSet:options:
rangeOfCharacterFromSet:options:range:


[편집] Searching strings

rangeOfString:... 메소드를 사용하여 리시버 내의 서브스트링을 검색할 수 있습니다. rangeOfCharacterFromSet:... 메소드는 제공된 캐릭터 셋으로부터 각각의 캐릭터를 검색합니다.

서브스트링은 특정 범위(range) 내에 완전히 포함되어 있는 경우에만 검색됩니다. 만일 검색이나 비교 메소드에 범위를 지정하고 NSLiteralSearch(아래 참조)를 요청하지 않으면 그 범위는 구성된 캐릭터 시퀀스를 줄의 처음이나 끝에서 분리해서는 안됩니다. 만일 이렇게 되면 부정확한 결과를 얻을 수도 있습니다. (rangeOfComposedCharacterSequenceAtIndex: 메소드 설명을 참조하여 캐릭터 시퀀스 경계에 따라 범위를 조절하는 코드 샘플을 보십시오.)

또한 스트링 객체를 NSScanner의 인스턴스를 사용하여 숫자나 스트링 값으로 스캔할 수 있습니다. 스캐너에 대한 추가 정보는 "Scanners"를 참조하십시오. NSString과 NSScanner 클래스 클러스터 모두 NSCharacterSet 클래스 클러스터를 사용하여 검색 작업을 수행합니다. 캐릭터 셋에 대한 추가 정보는 "Character Sets"에서 찾을 수 있습니다.

만일 단순하게 스트링이 주어진 패턴을 포함하고 있는지 알아내길 원한다면 프레디킷을 사용할 수 있습니다.


BOOL match = [myPredicate evaluateWithObject:myString];

프레디킷에 대한 추가 정보는 Predicate Programming Guide에서 참조하십시오.


[편집] Comparing and sorting strings

compare:... 메소드는 리시버와 제공된 스트링의 사전적 순서를 반환합니다. 다른 메소드는 두 종류의 스트링이 동일한지, 혹은 한 스트링이 다른 스트링의 접두어거나 접미어인지를 알려줍니다. 그러나 검색 옵션이나 범위를 지정할 수 있는 변형 메소드는 없습니다.

스트링을 비교하는데 사용할 수 있는 가장 단순한 메소드는 compare: 입니다. 이 메소드는 compare:options:range: 메소드에 옵션을 넘기지 않고 범위에 리시버의 총 범위를 넘기 경우와 동일합니다. NSCaseInsensitiveSearch, NSLiteralSearch, NSNumericSearch와 같은 비교 옵션을 지정하길 원한다면, compare:options:를 사용할 수 있습니다. 특정 지역(locale)을 지정해주길 원한다면 compare:optios:range:locale:을 사용할 수 있습니다. NSString은 흔히 사용되는 비교 작업에 범위와 옵션을 직접 지정해 주지 않고 편하게 쓸수 있는 caseInsensitiveCompare:와 localizedCompare:같은 메소드도 제공합니다.


중요: 사용자에게 보이는 정렬된 리스트는 언제나 로컬화된 비교를 해야합니다. 따라서 보통 compare:나 caseInsensitiveCompare:대신 localizedCompare:나 localizedCaseInsensitiveCompare:를 사용해야 합니다.


스트링을 비교하여 파인더에서 나타나는 방식과 동일하게 정렬하고자 한다면, compare:options:range:locale:을 사용자의 지역(locale)과 다음 옵션을 사용해야 합니다. NSCaseInsensitiveSearch, NSNumericSearch, NSWidthInsensitiveSearch, NSForcedOrderingSearch. "Sorting strings like Finder"에서 예를 찾을 수 있습니다.



[편집] Search and Comparison Options

몇몇 검색 및 비교 메소드들은 "options" 인자를 받습니다. 이것은 작업에 추가적인 제약을 더하는 비트마스크입니다. 다음 옵션을 결합하여 마스크를 생성합니다. (모든 메소드가 모든 옵션을 받지는 않습니다.)


검색 옵션 효과
NSCaseInsensitiveSearch 캐릭터간 대소문자 구별을 무시합니다.
NSLiteralSearch 바이트-대-바이트 비교를 수행합니다. 다른 경우에는 동일하다고 여겨지는 결합된 캐릭터 시퀀스와 같이 다른 리터럴 시퀀스는 동일하지 않은 것으로 처리됩니다. 이 옵션을 사용하면 다른 작업의 속도를 상당히 빠르게 해줄 수 있습니다.
NSBackwardsSearch 범위의 마지막에서 앞쪽으로 검색을 수행합니다.
NSAnchoredSearch 범위의 맨 앞이나 마지막의 캐릭터만 검색합니다. 처음이나 마지막에 일치하는 결과가 없으면 스트링의 다른 부분에서 일치하더라도 해당 결과가 없는 것이 됩니다.
NSNumericSearch compare:options:와 함께 쓰이면 숫자 그룹은 숫자 값으로 처리되어 비교할 수 있습니다. 예를들어 Filename9.txt < Filename20.txt <Filename100.txt.


현재 검색과 비교는 NSLiteralSearch 옵션이 지정된 것처럼 동작합니다.


[편집] Examples

[편집] Case-Insensitive Search for Prefix and Suffix

NSString은 hasPrefix:와 hasSuffix: 메소드를 제공하여 접투어나 접미어와 정확히 일치하는 스트링을 찾을 수 있습니다. 다음 예는 rangeOfString:options: 메소드와 옵션을 함께 사용하여 대소문자 구별을 하지 않는 검색을 수행하는 방법을 보여줍니다.


 
NSString *searchString = @"age";
 
NSString *beginsTest = @"Agencies";
NSRange prefixRange = [beginsTest rangeOfString:searchString
    options:(NSAnchoredSearch | NSCaseInsensitiveSearch)];
 
// prefixRange = {0, 3}
 
NSString *endsTest = @"BRICOLAGE";
NSRange suffixRange = [endsTest rangeOfString:searchString
    options:(NSAnchoredSearch | NSCaseInsensitiveSearch | NSBackwardsSearch)];
 
// suffixRange = {7, 3}


[편집] Comparing Strings

다음 예는 다양한 비교 메소드와 관련된 옵션들의 사용법을 보여줍니다. 첫번째는 가장 간단한 비교 메소드를 보여줍니다.


NSString *string1 = @"string1";
NSString *string2 = @"string2";
NSComparisonResult result;
result = [string1 compare:string2];
// result = -1 (NSOrderedAscending)


NSNumericSearch 옵션을 사용하여 스트링을 숫자로 비교할 수 있습니다.


NSString *string10 = @"string10";
NSString *string2 = @"string2";
NSComparisonResult result;
 
result = [string10 compare:string2];
// result = -1 (NSOrderedAscending)
 
result = [string10 compare:string2 options:NSNumericSearch];
// result = 1 (NSOrderedDescending)


caseInsensitiveCompare:와 localizedCaseInsensitiveCompare: 를 사용하여 편리하게 대소문자를 구별하지 않는 비교를 수행할 수 있습니다.


NSString *string_a = @"Aardvark";
NSString *string_A = @"AARDVARK";
 
result = [string_a compare:string_A];
// result = 1 (NSOrderedDescending)
 
result = [string_a caseInsensitiveCompare:string_A];
// result = 0 (NSOrderedSame)
// equivalent to [string_a compare:string_A options:NSCaseInsensitiveSearch]


[편집] Sorting strings like Finder

다음 예에서는 파인더에서와 동일한 방식으로 스트링을 비교하고 정렬하는 방법을 보여줍니다. 먼저 정렬 함수를 정의하여 관련된 비교 옵션을 포함하도록 합니다. (효율성을 위해 컨텍스트에 사용자의 지역을 건내어 단 한번만 참고하게 합니다.)


int finderSortWithLocale(id string1, id string2, void *locale)
{
    static int comparisonOptions =
        NSCaseInsensitiveSearch | NSNumericSearch |
        NSWidthInsensitiveSearch | NSForcedOrderingSearch;
 
    NSRange string1Range = NSMakeRange(0, [string1 length]);
 
    return [string1 compare:string2
                    options:comparisonOptions
                    range:string1Range
                    locale:(NSLocale *)locale];
}


사용자의 현재 지역을 컨텍스트로 넘기면서 sortedArrayUsingFunction:context:의 파라미터로 이 함수를 넘깁니다.


NSArray *stringsArray = [NSArray arrayWithObjects:
                         @"string 1",
                         @"String 21",
                         @"string 12",
                         @"String 11",
                         @"String 02", nil];
 
NSArray *sortedArray = [stringsArray sortedArrayUsingFunction:finderSortWithLocale
                                     context:[NSLocale currentLocale]];
 
// sortedArray contains { "string 1", "String 02", "String 11", "string 12", "String 21" }


< Previous Page Next Page >


번역자 사용자:Idiel
원본문서링크 http://developer.apple.com/documentation/Cocoa/Conceptual/Strings/Articles/SearchingStrings.html (Last Updated - 2007-10-18)