【发布时间】:2011-12-13 03:59:51
【问题描述】:
我有一个字符串,其中包含带有辅音和元音的单词。如何从字符串中只提取辅音?
NSString *str = @"consonants.";
结果必须是:
cnsnnts
【问题讨论】:
标签: iphone objective-c ios nsstring
我有一个字符串,其中包含带有辅音和元音的单词。如何从字符串中只提取辅音?
NSString *str = @"consonants.";
结果必须是:
cnsnnts
【问题讨论】:
标签: iphone objective-c ios nsstring
您可以创建一个包含所有元音 (@"aeiouy") 的字符集
+ (id)characterSetWithCharactersInString:(NSString *)aString
然后使用
- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set
方法。
编辑:这只会删除字符串开头和结尾的元音,正如另一篇文章中指出的那样,您可以做的是使用
- (NSArray *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator
然后将组件重新粘在一起。您可能还需要在集合中包含元音的大写版本,如果您还想处理重音(à á è è ê ì 等...),您可能还必须包含它。
【讨论】:
不幸的是,stringByTrimmingCharactersInSet 无法工作,因为它只会修剪前导和结束字符,但您可以尝试使用正则表达式和替换,如下所示:
[[NSRegularExpression
regularExpressionWithPattern:@"[^bcdefghjklmnpqrstvwx]"
options:NSRegularExpressionCaseInsensitive
error:NULL]
stringByReplacingMatchesInString:str
options:0
range:NSMakeRange(0, [str length])
withTemplate:@""]
您可能希望根据需要调整正则表达式和选项。
【讨论】:
invertedSet 应该解决的问题。但我现在看到它不会像 stringByTrimmingCharactersInSet 那样只修剪前导和结束字符。
@"[aeiou]"
可能的,肯定不是最佳的解决方案。我正在打印中间结果以供您学习。注意内存分配(我不在乎)。希望有人会给您一个更好的解决方案,但您可以暂时复制并粘贴它。
NSString *test = @"Try to get all consonants";
NSMutableString *found = [[NSMutableString alloc] init];
NSInteger loc = 0;
NSCharacterSet *consonants = [NSCharacterSet characterSetWithCharactersInString:@"bcdfghjklmnpqrstvwxyz"];
while(loc!=NSNotFound && loc<[test length]) {
NSRange r = [[test lowercaseString] rangeOfCharacterFromSet:consonants options:0 range:NSMakeRange(loc, [test length]-loc)];
if(r.location!=NSNotFound) {
NSString *temp = [test substringWithRange:r];
NSLog(@"Range: %@ Temp: %@",NSStringFromRange(r), temp);
[found appendString:temp];
loc=r.location+r.length;
} else {
loc=NSNotFound;
}
}
NSLog(@"Found: %@",found);
【讨论】:
这是一个可以完成这项工作的 NSString 类别:
- (NSString *)consonants
{
NSString *result = [NSString stringWithString:self];
NSCharacterSet *characterSet = [NSCharacterSet characterSetWithCharactersInString:@"aeiou"];
while(1)
{
NSRange range = [result rangeOfCharacterFromSet:characterSet options:NSCaseInsensitiveSearch];
if(range.location == NSNotFound)
break;
result = [result stringByReplacingCharactersInRange:range withString:@""];
}
return result;
}
【讨论】: