有效的方式还是将“ a”替换为“ an”?

问题描述 投票:0回答:1

在我最近的项目中,我正在动态地构建句子,然后在通过文本进行语法上的“清理”之后。我要做的一个任务是将出现的“ 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”情况,只是为了避免所有后续替换行的无效性。我认为必须有一种更流畅,更有效的方式(也许使用正则表达式)来做到这一点?

objective-c string nsstring nsregularexpression
1个回答
2
投票

根据您建议的正则表达式,NSRegularExpression这是一个可能有用的基础工具。

这里是一个例子:

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:@"$1n$2"]; options:0条目只是我在可能在实际用例中有用的选项上打了个比方。
  • 我加上了字边界(error:nil),以捕捉我想像的在标点符号之后出现的棘手的“ a”(例如“下雨了; appeared出现了。”)。 [编辑:哎呀,我错了,那是我在想一个“ A” 开始一个句子的地方。]

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.