ティムが言及しているように、正規表現を使用して、i
またはを含むテキストに一致させることができますı
。また、検索で大量の文字列が検索されるため、新しいフィールドを追加したり、ソース データを変更したりしたくありませんでした。そこで、正規表現とNSPredicate
.
NSString
カテゴリを作成し、このメソッドをコピーします。or
基本的なマッチング パターンを返します。正規表現パターンを受け入れる任意のメソッドで使用できます。
- (NSString *)zst_regexForTurkishLettersWithCaseSensitive:(BOOL)caseSensitive
{
NSMutableString *filterWordRegex = [NSMutableString string];
for (NSUInteger i = 0; i < self.length; i++) {
NSString *letter = [self substringWithRange:NSMakeRange(i, 1)];
if (caseSensitive) {
if ([letter isEqualToString:@"ı"] || [letter isEqualToString:@"i"]) {
letter = @"[ıi]";
} else if ([letter isEqualToString:@"I"] || [letter isEqualToString:@"İ"]) {
letter = @"[Iİ]";
}
} else {
if ([letter isEqualToString:@"ı"] || [letter isEqualToString:@"i"] ||
[letter isEqualToString:@"I"] || [letter isEqualToString:@"İ"]) {
letter = @"[ıiIİ]";
}
}
[filterWordRegex appendString:letter];
}
return filterWordRegex;
}
したがって、検索語がの場合、大文字と小文字を区別する検索と大文字と小文字を区別しない検索Şırnak
が作成されます。Ş[ıi]rnak
Ş[ıiIİ]rnak
そして、ここに可能な用途があります。
NSString *testString = @"Şırnak";
// First create your search regular expression.
NSString *searchWord = @"şır";
NSString *searchPattern = [searchWord zst_regexForTurkishLettersWithCaseSensitive:NO];
// Then create your matching pattern.
NSString *pattern = searchPattern; // Direct match
// NSString *pattern = [NSString stringWithFormat:@".*%@.*", searchPattern]; // Contains
// NSString *pattern = [NSString stringWithFormat:@"\\b%@.*", searchPattern]; // Begins with
// NSPredicate
// c for case insensitive, d for diacritic insensitive
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self matches[cd] %@", pattern];
if ([predicate evaluateWithObject:testString]) {
// Matches
}
// If you want to filter an array of objects
NSArray *matchedCities = [allAirports filteredArrayUsingPredicate:
[NSPredicate predicateWithFormat:@"city matches[cd] %@", pattern]];
も使用できますNSRegularExpression
が、大文字と小文字を区別しない検索を使用するNSPredicate
方がはるかに簡単だと思います。