有效的方法还是用 "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:0
和 error:nil
条目只是我对可能在实际用例中有用的选项的赌注。
- 我添加了单词边界 (
\b
),以捕捉我认为可能比较棘手的 post-标点出现的 "a"(例如 "It rained; a earthworm appeared.")。 [编辑:哎呀,我错了,那是我想用“A”开始一个句子的地方。]
希望对您有所帮助!
在我最近的项目中,我动态地构建句子,然后在语法上检查我的文本 "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:0
和error:nil
条目只是我对可能在实际用例中有用的选项的赌注。- 我添加了单词边界 (
\b
),以捕捉我认为可能比较棘手的 post-标点出现的 "a"(例如 "It rained; a earthworm appeared.")。 [编辑:哎呀,我错了,那是我想用“A”开始一个句子的地方。]
希望对您有所帮助!