作爲添提到,我們可以使用正則表達式來匹配包含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
,它區分大小寫和Ş[ıiIİ]rnak
不區分大小寫的搜索創建Ş[ıi]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
更加簡單。
檢查出來,我不認爲這是值得通過蘋果的文檔搜索的努力,我只想用一個正則表達式在你的地方。 –
您提到的文檔涵蓋了與您在此處不同的情況。如果你有一個大寫無字符串的字符串,並且你用普通的我做了一個不區分大小寫的搜索,那麼除非你使用土耳其語區域,否則它將正常工作。隨着土耳其語區域,大寫無點我只能找到一個小寫無點我,而不是一個普通的我。我做了一些測試,不管區域設置如何,似乎沒有任何方法可以找到與普通i相匹配的無點。也許這是一個錯誤。 – rmaddy
@rmaddy我只是假設如果不區分大小寫的'I'搜索匹配'i'和'ı',那麼_surely_對'i'的大小寫不敏感的搜索匹配'i'和'ı'。也許我只需要更多地瞭解土耳其語:( – deanWombourne