CamelCase强调并回到Objective-C

Joh*_*ker 15 string objective-c nsstring

我正在寻找一种简单有效的方法将CamelCase中的字符串转换为下划线表示法(即MyClassName - > my_class_name),然后再回到Objective C中.

我目前的解决方案涉及到大量的rangeOfString,characterAtIndexreplaceCharactersInRange上NSMutableStrings运营,只是普通的地狱丑陋:)看来,必须有一个更好的解决办法,但我不知道它是什么.

我宁愿不为这一个用例导入一个正则表达式库,尽管如果其他所有失败都是一个选项.

Rob*_*ier 10

克里斯对RegexKitLite的建议很好.这是一个很好的工具包,但是使用NSScanner可以很容易地完成.-scanCharactersFromSet:intoString:+uppercaseLetterCharacterSet和之间交替使用+lowercaseLetterCharacterSet.对于返回,您可以使用-scanUpToCharactersFromSet:仅使用下划线的字符集.


Jon*_*ess 9

这些怎么样:

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.


mal*_*hal 9

试试这个魔法:

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

  • 如果字符串是Pascal情况,即MyBundleVersion,它将产生_my_bundle_version (3认同)