Joh*_*ker 15 string objective-c nsstring
我正在寻找一种简单有效的方法将CamelCase中的字符串转换为下划线表示法(即MyClassName - > my_class_name),然后再回到Objective C中.
我目前的解决方案涉及到大量的rangeOfString,characterAtIndex和replaceCharactersInRange上NSMutableStrings运营,只是普通的地狱丑陋:)看来,必须有一个更好的解决办法,但我不知道它是什么.
我宁愿不为这一个用例导入一个正则表达式库,尽管如果其他所有失败都是一个选项.
这些怎么样:
NSString *MyCamelCaseToUnderscores(NSString *input) {
NSMutableString *output = [NSMutableString string];
NSCharacterSet *uppercase = [NSCharacterSet uppercaseLetterCharacterSet];
for (NSInteger idx = 0; idx < [input length]; idx += 1) {
unichar c = [input characterAtIndex:idx];
if ([uppercase characterIsMember:c]) {
[output appendFormat:@"_%@", [[NSString stringWithCharacters:&c length:1] lowercaseString]];
} else {
[output appendFormat:@"%C", c];
}
}
return output;
}
NSString *MyUnderscoresToCamelCase(NSString *underscores) {
NSMutableString *output = [NSMutableString string];
BOOL makeNextCharacterUpperCase = NO;
for (NSInteger idx = 0; idx < [underscores length]; idx += 1) {
unichar c = [underscores characterAtIndex:idx];
if (c == '_') {
makeNextCharacterUpperCase = YES;
} else if (makeNextCharacterUpperCase) {
[output appendString:[[NSString stringWithCharacters:&c length:1] uppercaseString]];
makeNextCharacterUpperCase = NO;
} else {
[output appendFormat:@"%C", c];
}
}
return output;
}
Run Code Online (Sandbox Code Playgroud)
一些缺点是它们确实使用临时字符串在大写和小写之间进行转换,并且它们没有任何拼写错误的逻辑,因此myURL将导致my_u_r_l.
试试这个魔法:
NSString* camelCaseString = @"myBundleVersion";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?<=[a-z])([A-Z])|([A-Z])(?=[a-z])" options:0 error:nil];
NSString *underscoreString = [[regex stringByReplacingMatchesInString:camelCaseString options:0 range:NSMakeRange(0, camelCaseString.length) withTemplate:@"_$1$2"] lowercaseString];
NSLog(@"%@", underscoreString);
Run Code Online (Sandbox Code Playgroud)
输出:my_bundle_version
| 归档时间: |
|
| 查看次数: |
5480 次 |
| 最近记录: |