在希伯来语中,即使在谓词中使用“d”(音标不敏感)修饰符,某些元音字母仍然无法被NSPredicate忽略。我被告知解决办法是使用正则表达式进行搜索。
如何使用正则表达式搜索包含元音字母的希伯来文本,并忽略这些元音字母?
编辑:换句话说,如果我想搜索以下文本,忽略破折号和星号,我该如何使用正则表达式进行搜索?
示例文本:
"I w-en*t t-o the st*o*r*-e yes-ster*day."
编辑2:基本上,我想要:
1. 从用户获取输入字符串 2. 取一个字符串进行搜索 3. 根据用户的搜索字符串使用正则表达式在较大的文本块中搜索“包含”匹配项。正则表达式应该像上面那样忽略元音字母。
编辑3:这是我实现搜索的方式:
如何使用正则表达式搜索包含元音字母的希伯来文本,并忽略这些元音字母?
编辑:换句话说,如果我想搜索以下文本,忽略破折号和星号,我该如何使用正则表达式进行搜索?
示例文本:
"I w-en*t t-o the st*o*r*-e yes-ster*day."
编辑2:基本上,我想要:
1. 从用户获取输入字符串 2. 取一个字符串进行搜索 3. 根据用户的搜索字符串使用正则表达式在较大的文本块中搜索“包含”匹配项。正则表达式应该像上面那样忽略元音字母。
编辑3:这是我实现搜索的方式:
//
// The user updated the search text
//
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller
shouldReloadTableForSearchString:(NSString *)searchString{
NSMutableArray *unfilteredResults = [[[[self.fetchedResultsController sections] objectAtIndex:0] objects] mutableCopy];
if (self.filteredArray == nil) {
self.filteredArray = [[[NSMutableArray alloc ] init] autorelease];
}
[filteredArray removeAllObjects];
NSPredicate *predicate;
if (controller.searchBar.selectedScopeButtonIndex == 0) {
predicate = [NSPredicate predicateWithFormat:@"articleTitle CONTAINS[cd] %@", searchString];
}else if (controller.searchBar.selectedScopeButtonIndex == 1) {
predicate = [NSPredicate predicateWithFormat:@"articleContent CONTAINS[cd] %@", searchString];
}else if (controller.searchBar.selectedScopeButtonIndex == 2){
predicate = [NSPredicate predicateWithFormat:@"ANY tags.tagText CONTAINS[cd] %@", searchString];
}else{
predicate = [NSPredicate predicateWithFormat:@"(ANY tags.tagText CONTAINS[cd] %@) OR (dvarTorahTitle CONTAINS[cd] %@) OR (dvarTorahContent CONTAINS[cd] %@)", searchString,searchString,searchString];
}
for (Article *article in unfilteredResults) {
if ([predicate evaluateWithObject:article]) {
[self.filteredArray addObject:article];
}
}
[unfilteredResults release];
return YES;
}
编辑 4:
我不是必须使用正则表达式,只是被建议这样做。如果你有其他可行的方法,请尝试使用!
编辑 5:
我已经修改了我的搜索方式,变成了这样:
NSInteger length = [searchString length];
NSString *vowelsAsRegex = @"[\\u5B0-\\u55C4]*";
NSMutableString *modifiedSearchString = [searchString mutableCopy];
for (int i = length; i > 0; i--) {
[modifiedSearchString insertString:vowelsAsRegex atIndex:i];
}
if (controller.searchBar.selectedScopeButtonIndex == 0) {
predicate = [NSPredicate predicateWithFormat:@"articleTitle CONTAINS[cd] %@", modifiedSearchString];
}else if (controller.searchBar.selectedScopeButtonIndex == 1) {
predicate = [NSPredicate predicateWithFormat:@"articleContent CONTAINS[cd] %@", modifiedSearchString];
}else if (controller.searchBar.selectedScopeButtonIndex == 2){
predicate = [NSPredicate predicateWithFormat:@"ANY tags.tagText CONTAINS[cd] %@", modifiedSearchString];
}else{
predicate = [NSPredicate predicateWithFormat:@"(ANY tags.tagText CONTAINS[cd] %@) OR (dvarTorahTitle CONTAINS[cd] %@) OR (dvarTorahContent CONTAINS[cd] %@)", modifiedSearchString,modifiedSearchString,modifiedSearchString];
}
for (Article *article in unfilteredResults) {
if ([predicate evaluateWithObject:article]) {
[self.filteredArray addObject:article];
}
}
我还缺少一些东西,我需要做什么才能让这个工作?
编辑6:
好的,快完成了。我还需要进行另外两个更改才能完成这个。
我需要能够添加其他字符范围到正则表达式中,这些范围可能会代替或者补充其他字符集合中的字符。我尝试将第一个范围更改为以下内容:
[\u05b0-\u05c, \u0591-\u05AF]?
有些东西告诉我这是不正确的。
而且,我需要剩下的正则表达式不区分大小写。我需要在.*
正则表达式中使用哪个修饰符来使其不区分大小写?