Searching, Comparing, and Sorting Strings
OSXDEV
스트링 클래스들은 스트링간의 비교를 위해 캐릭터 및 서브스트링 찾기 메소드를 제공합니다. 이들 메소드는 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: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) |




