在iOS上使用多个正则表达式替换文本

时间:2015-12-16 17:03:49

标签: ios objective-c regex string nsregularexpression

我在regex中使用iOS时非常陌生,我正在尝试使用它。我正努力寻找解决问题的方法。如果之前已经回答过,或者我错过了一些非常明显的事情和/或使用错误的工具来实现我的目标,我会事先道歉。

我有一个用户将在textfield中输入的字符串。然后我如何更改它以纠正字符串中包含的单词的拼写?

NSString *userstring = @"Jon Travalta";
NSError *error = NULL;
NSString *modstring = @"";

NSRegularExpression *regex = [[NSRegularExpression alloc]init];
regex = [NSRegularExpression regularExpressionWithPattern:@"(Jon|Johnathan|Jonathen|John)\\s(Travalta|Travalte|Travelta|Travolta)" options:NSRegularExpressionCaseInsensitive error:&error];

modstring = [regex stringByReplacingMatchesInString:userstring options:0 range:NSMakeRange(0,[userstring length]) withTemplate:@"John Travolta"];

这有效并纠正了字符串,但让我们说字符串是别的。我希望保持该正则表达式处于活动状态以检查字符串是否包含任何要纠正的字符串。

所以,让我们说在上述检查之前,字符串已经设置为" Anthony Hopkin"。然后我还会使用另一个regexwithpattern来检查字符串,以便使用正确的名称拼写来纠正该字符串。

regex = [NSRegularExpression regularExpressionWithPattern:@"(Anthony|Antony|Tony|)\\s(Hopkin|Hapkin|Hopkins)" options:NSRegularExpressionCaseInsensitive error:&error];

modstring = [regex stringByReplacingMatchesInString:userstring options:0 range:NSMakeRange(0,[userstring length]) withTemplate:@"Anthony Hopkins"];

这将取代安东尼霍普金斯的字符串,即使它是第一个字符串。

如果我对NSRegularExpressionstringByReplacingMatchesInString执行不同的分配,则它不会执行任何操作,并且字符串保持原样。

2 个答案:

答案 0 :(得分:2)

正则表达式不是拼写检查的正确工具。

在您的问题中,您希望根据正则表达式进行多次替换。为清楚起见,我只是迭代你可能的修正列表,一次应用一个。

-(NSString*) naiiveSpellCheckString:(NSString*) s {

  NSDictionary* corrections = @{
                                @"Travolta": @"Travalta|Travalte|Travelta|Travolta",
                                @"John": @"Jon|Johnathan|Jonathen",
                                @"Anthony":@"Anthoni|Antony|Tony",
                                @"Hopkins": @"Hopkin|Hapkin",
                                };

  for (NSString* key in corrections.keyEnumerator) {

      NSError* error;
      NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:[corrections objectForKey:key]
                                    options:NSRegularExpressionCaseInsensitive
                                    error:&error];

      NSAssert1(!error, @"Error parsing regex %@", [corrections objectForKey:key]);

      s = [regex stringByReplacingMatchesInString:s
                                          options:0
                                            range:NSMakeRange(0, s.length) withTemplate:key];

  }

  return s;
}

答案 1 :(得分:0)

我遇到了同样的事情,并建立了一种方法 将通过一系列array为我构建表达式。

NSArray* itemsArray = [@“Jon”, @“Johnathan”, @“Johnathen”, @“John”];

NSMutableString* builtString = @“”;

for (NSString* aItem in itemsArray) {
    NSString* formatString;
    if (![builtSting hasSuffix:@“| “] ) {
        formatString = [NSSting stringWithFormat:@“%@”, aItem];
    }
    else {
        formatString = [NSSting stringWithFormat:@“ | %@”, aItem];
    }
[builtSting stringByAppendingString:formatString];
}

————————————-

添加任何前缀或后缀以完成表达式

重复姓氏组

组合组并添加任何其他正则表达式前缀或后缀。

仅对每个名称执行搜索可能会比将超大多个名字/姓氏组合在一起更容易。 (而且更容易调试)