有效的方法还是用 "an" 替换 "a"?

Efficient way or replacing "a" with "an"?

在我最近的项目中,我动态地构建句子,然后在语法上检查我的文本 "clean things up"。我的一项任务是将出现的 "a" 切换为 "an",其中下一个单词的第一个字母是元音。现在,我只关心小写英语单词,而忽略以下以 'h'.

开头的单词

我现有的解决方案现在有效,但它看起来非常低效,而且如果我想在未来支持国际化,肯定无法扩展。

    if ([destination rangeOfString:@" a "].location != NSNotFound) {
        destination = [destination stringByReplacingOccurrencesOfString:@" a a" withString:@" an a"];
        destination = [destination stringByReplacingOccurrencesOfString:@" a e" withString:@" an e"];
        destination = [destination stringByReplacingOccurrencesOfString:@" a i" withString:@" an i"];
        destination = [destination stringByReplacingOccurrencesOfString:@" a o" withString:@" an o"];
        destination = [destination stringByReplacingOccurrencesOfString:@" a u" withString:@" an u"];
    }

我预先检查了“a”的情况,只是为了跳过所有那些替换行的低效率。我在想一定有一种更时尚、更高效的方式来做到这一点,也许是使用正则表达式?

一个可能对这里有用的基础工具是 NSRegularExpression,按照您建议的正则表达式行。

这是一个例子:

NSString* source = @"What is a apple doing in a toilet? A umbrella is in there too!";

NSRegularExpression *regex = [NSRegularExpression
                              regularExpressionWithPattern:@"\b([Aa])( [aeiou])"
                              options:0
                              error:nil];
NSString* result = [regex
                     stringByReplacingMatchesInString:source
                     options:0
                     range:NSMakeRange(0, [source length])
                     withTemplate:@"n"];

几个小笔记:

  • options:0error:nil 条目只是我对可能在实际用例中有用的选项的赌注。
  • 我添加了单词边界 (\b),以捕捉我认为可能比较棘手的 post-标点出现的 "a"(例如 "It rained; a earthworm appeared.")。 [编辑:哎呀,我错了,那是我想用“A”开始一个句子的地方。]

希望对您有所帮助!