objective-c - 如何使用正则表达式搜索 NSPredicate 忽略某些字符?

标签 objective-c ios regex search nspredicate

在希伯来语中,即使在谓词中使用 'd'(不区分变音符号)修饰符,NSPredicate 也无法忽略某些元音。有人告诉我解决方案是使用正则表达式进行搜索。

我如何获取搜索字符串并“使用正则表达式”来搜索包含元音字母的希伯来文文本,而忽略那些元音字母?

编辑:

换句话说,如果我想搜索以下文本,忽略破折号和星号,我该如何使用正则表达式来实现?

示例文本:

I w-en*t t-o the st*o*r*-e yes-ster*day.

编辑 2:

本质上,我想:

  1. 从用户那里获取输入字符串
  2. 取一个字符串进行搜索
  3. 使用基于用户搜索字符串的正则表达式在较大的文本 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/

相关文章:

iphone - 两个 uiwebview 但只有一个有效

iphone - Imageview 不显示正确的 Iphone 5 Retina

iOS SDK, TextView - 使链接在应用程序浏览器中打开

ios - 在 NSData 和 base64 字符串之间转换

正则表达式 : If-Clause for capturing group possible?

objective-c - 与存储在 NSMutableArray 中的 UIView 进行交互

ios - 什么情况下苹果的 'advertisingIdentifier'会重置?

ios - Skaction 之后是场景转换

javascript - Pilcrow (¶) 或偏微分 (∂) 字符的正则表达式模式

c++ - 为什么我的代码与这些s表达式不匹配正则表达式?