使用Objective C,基于大小写分割NSString的最佳方法是什么,例如: @"MyNameOfSomething" --> [NSArray arrayWithObjects: @"My", @"Name", @"Of, @"Something"].
我想在不使用第三方正则表达式库的情况下执行此操作,因为我不需要程序中任何其他内容的正则表达式功能。
更新:我的目标是iOS5 / Lion以上的旧版本,因此没有NSRegularExpression。我知道这可以用NSScanner完成,但我希望有人有一个现成的解决方案。
答案 0 :(得分:1)
如果您使用的是iOS5 / Mac OSX 10.7,则可以使用NSRegularExpression获取大写字母的位置。 (然后使用substringWithRange :)如果你需要向后兼容性,NSScanner是你(低效)的朋友。
答案 1 :(得分:1)
您可以使用正则表达式执行此操作。使用http://rubular.com测试正则表达式和RegexKitLite(http://regexkit.sourceforge.net/RegexKitLite/)以将Regex功能添加到您的应用程序中。
这是一个正则表达式,应该可以解决这个问题(它会选择NSString中的所有大写字母):[A-Z]
我不确定,但我认为你可以利用这种方法- (NSArray *)componentsSeparatedByRegex:(NSString *)regex options:(RKLRegexOptions)options range:(NSRange)range error:(NSError **)error;
做你想做的事。
这样做的好处是适用于10.5,实现起来非常简单!
答案 2 :(得分:1)
我知道这可以通过NSScanner完成,但我希望有人有一个现成的解决方案。
你走了:
NSString *chopString = stringToSplit.copy; /// @"stringToSplit" Goes Here
NSString *resultingString;
NSCharacterSet *capsSet = [NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZ"];
while (chopString.length > 0) {
/// Pull the first character out each time ///
/// Since it may trigger the Scanner ///
NSString *firstChar = [chopString stringByReplacingCharactersInRange:(NSRange){1, chopString.length-1} withString:@""];
chopString = [chopString stringByReplacingCharactersInRange:(NSRange){0,1} withString:@""];
/// Scan up to the next Capital letter ///
NSString *upToString;
NSScanner *chopScanner = [NSScanner scannerWithString: chopString];
[chopScanner scanUpToCharactersFromSet:capsSet intoString:&upToString];
/// Feed first character and scan results into string ///
/// Separated by a space ///
if (!resultingString)
resultingString = [NSString stringWithFormat:@"%@%@",firstChar,upToString];
else
resultingString = [NSString stringWithFormat:@"%@ %@%@", resultingString,firstChar,upToString];
/// Chop the remaining string down by the length of the scan ///
chopString = [chopString stringByReplacingCharactersInRange:(NSRange){0,chopScanner.scanLocation} withString:@""];
}
resultingString = [resultingString capitalizedString]; /// @"String To Split" Comes Out!