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

Replace text with multiple Regular Expressions on iOS

我对在 iOS 中使用 regex 还很陌生,我正在试验它。我正在努力寻找解决问题的方法。如果之前有人回答过这个问题,或者我只是遗漏了一些非常明显的东西,我会提前道歉 and/or 使用错误的工具来实现我的目标。

我有一个字符串,用户将在 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"];

这会将字符串替换为 Anthony Hopkins,即使它是第一个字符串。

如果我对 NSRegularExpression 和不同的 stringByReplacingMatchesInString 执行不同的分配,它不会执行任何操作,字符串保持原来的状态。

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

在您的问题中,您想根据正则表达式进行多次替换。为清楚起见,我只是遍历您的可能更正列表,一次应用它们。

-(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;
}

我 运行 进入同样的东西,我建立了一个方法 将从一系列字符串中为我构建表达式。

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];
}

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

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

重复姓氏组

合并组并添加任何额外的正则表达式前缀或后缀。

只对每个名字执行搜索,而不是组合一个超大的多个名字/姓氏,可能更容易。 (更容易调试)