在希伯来语中,即使在谓词中使用 'd'(不区分变音符号)修饰符,NSPredicate 也无法忽略某些元音。有人告诉我解决方案是使用正则表达式进行搜索。
我如何获取搜索字符串并“使用正则表达式”来搜索包含元音字母的希伯来文文本,而忽略那些元音字母?
编辑:
换句话说,如果我想搜索以下文本,忽略破折号和星号,我该如何使用正则表达式来实现?
示例文本:
I w-en*t t-o the st*o*r*-e yes-ster*day.
编辑 2:
本质上,我想:
- 从用户那里获取输入字符串
- 取一个字符串进行搜索
- 使用基于用户搜索字符串的正则表达式在较大的文本 block 中搜索“包含”匹配项。如上所示,正则表达式应忽略元音。
编辑 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]?
有些事情告诉我这是不正确的。
另外,我需要正则表达式的其余部分不区分大小写。我需要对 .*
正则表达式使用什么修饰符才能使其不区分大小写?
最佳答案
希伯来语元音在 Unicode 中定义明确:Table of Hebrew characters and Marks
当您收到用户输入的字符串时,您可以在每个字符之间以及字符串前后插入正则表达式[\u05B0-\u05C4]*
。 ([]
表示匹配任何包含的字符,*
表示匹配零次或多次出现的表达式。)然后你可以搜索文本 block ,使用这个作为正则表达式。此表达式允许您从用户的输入中找到准确的字符串。用户还可以指定此表达式将找到的所需元音。
我认为与其尝试“忽略”元音,不如从大文本 block 和用户字符串中删除元音会更容易。然后你可以像往常一样只搜索字母。如果您不需要显示用户找到的语音文本,则此方法可行。
关于objective-c - 如何使用正则表达式搜索 NSPredicate 忽略某些字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8032430/