Поиск, сравнение и сортировка строк

Строковые классы обеспечивают методы для нахождения символов и подстрок в строках и для сравнения одной строки другому. Эти методы соответствуют стандарту Unicode для определения, эквивалентны ли две последовательности символов. Строковые классы обеспечивают методы сравнения, обрабатывающие составленные последовательности символов должным образом, хотя у Вас действительно есть опция указания литерального поиска, когда эффективность будет важна, и можно гарантировать некоторую каноническую форму для составленных последовательностей символов.

Методы поиска и методы сравнения

Методы поиска и методы сравнения каждый приезжает в несколько вариантов. Самая простая версия каждого ищет или сравнивает все строки. Другие варианты позволяют Вам изменять способ, которым сравнение составленных последовательностей символов выполняется и указать определенный диапазон символов в строке, которая будет искаться или сравниваться; можно также искать и сравнить строки в контексте данной локали.

Это основные методы поиска и методы сравнения:

Поиск строк

Вы используете rangeOfString:... методы для поиска подстроки в получателе. rangeOfCharacterFromSet:... методы ищут отдельные символы от предоставленного набора символов.

Подстроки сочтены только если полностью содержавшими в указанном диапазоне. Если Вы указываете диапазон для метода поиска или метода сравнения и не запрашиваете NSLiteralSearch (см. ниже), диапазон не должен повреждать составленные последовательности символов ни на одном конце; если это делает, Вы могли бы получить неправильный результат. (См. описание метода для rangeOfComposedCharacterSequenceAtIndex: для примера кода, корректирующего диапазон для расположения на границах последовательности символов.)

Можно также отсканировать строковый объект для числового и представить значения в виде строки с помощью экземпляра NSScanner. Для больше о сканерах, посмотрите Сканеры. Оба NSString и NSScanner кластеры класса используют NSCharacterSet кластер класса для поисковых операций. Для больше о наборах символов, посмотрите Наборы символов.

Если Вы просто хотите определить, содержит ли строка данный образец, можно использовать предикат:

BOOL match = [myPredicate evaluateWithObject:myString];

Для больше о предикатах, см. Руководство по программированию Предиката.

Сравнение и сортировка строк

compare:... методы возвращают лексическое упорядочивание получателя и предоставленной строки. Несколько других методов позволяют Вам определять, равны ли две строки или является ли каждый префиксом или суффиксом другого, но у них нет вариантов, позволяющих Вам указывать параметры поиска или диапазоны.

Самый простой метод, который можно использовать для сравнения строк, compare:— это совпадает с вызовом compare:options:range: без опций и полного объема получателя как диапазон. Если Вы хотите указать опции сравнения (NSCaseInsensitiveSearch, NSLiteralSearch, или NSNumericSearch) можно использовать compare:options:; если Вы хотите указать локаль, можно использовать compare:options:range:locale:. NSString также обеспечивает различные удобные методы позволить Вам выполнять общие сравнения без потребности указать диапазоны и опции непосредственно, например caseInsensitiveCompare: и localizedCompare:.

Если Вы хотите сравнить строки для упорядочивания их таким же образом, поскольку они представлены в Средстве поиска, необходимо использовать compare:options:range:locale: с локалью пользователя и следующими опциями: NSCaseInsensitiveSearch, NSNumericSearch, NSWidthInsensitiveSearch, и NSForcedOrderingSearch. Для примера посмотрите строки Сортировки как Средство поиска.

Поиск и опции сравнения

Несколько из методов поиска и методов сравнения берут параметр «опций». Это - немного маски, добавляющей дальнейшие ограничения к работе. Вы создаете маску путем объединения следующих опций (не, все опции доступны для каждого метода):

Параметр поиска

Эффект

NSCaseInsensitiveSearch

Игнорирует различия случая среди символов.

NSLiteralSearch

Выполняет сравнение байта для байта. Отличающиеся литеральные последовательности (такие как составленные последовательности символов), который иначе считали бы эквивалентным, как полагают, не соответствуют. Используя эту опцию может ускорить некоторые операции существенно.

NSBackwardsSearch

Выполняет поиск от конца диапазона к началу.

NSAnchoredSearch

Выполняет поиск только на символах вначале или, если NSBackwardsSearch также указан, конец диапазона. Никакое соответствие вначале или конец не означают, что ничто не найдено, даже если соответствующая последовательность символов происходит в другом месте в строке.

NSNumericSearch

Когда используется с compare:options: методы, группы чисел обрабатываются как числовое значение в целях сравнения. Например, Filename9.txt < Filename20.txt < Filename100.txt.

Поиск и сравнение в настоящее время выполняются как будто NSLiteralSearch опция была указана.

Примеры

Поиск без учета регистра префикса и суффикса

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 = {6, 3}

Сравнение строк

Следующие примеры иллюстрируют использование различных методов сравнения строк и связанных опций. Первые шоу самый простой метод сравнения.

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]

Сортировка строк как Средство поиска

К строкам вида путь Средство поиска делает в OS X v10.6 и позже, использование localizedStandardCompare: метод. Это должно использоваться каждый раз, когда имена файлов или другие строки представлены в списках и таблицах, где подобная Средству поиска сортировка является надлежащей. Точное поведение этого метода отличается при различных локализациях, таким образом, клиенты не должны зависеть от точного порядка сортировки строк.

Следующий пример показывает другую реализацию схожей функциональности, сравнивая строки для упорядочивания их таким же образом, поскольку они представлены в Средстве поиска, и это также показывает, как сортировать массив строк. Во-первых, определите функцию сортировки, включающую соответствующие опции сравнения (для эффективности, передайте локаль пользователя как контекст — этот способ, которым это только искало один раз).

int finderSortWithLocale(id string1, id string2, void *locale)
{
    static NSStringCompareOptions 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 = @[@"string 1",
                          @"String 21",
                          @"string 12",
                          @"String 11",
                          @"String 02"];
 
NSArray *sortedArray = [stringsArray sortedArrayUsingFunction:finderSortWithLocale
                                     context:[NSLocale currentLocale]];
 
// sortedArray contains { "string 1", "String 02", "String 11", "string 12", "String 21" }