Objective c 如何将NSString从CamelCase转换为TitleCase,';playerName';进入';玩家名称';?
我正在寻找将字符串从camelback格式转换为Title-Case格式的最简单方法Objective c 如何将NSString从CamelCase转换为TitleCase,';playerName';进入';玩家名称';?,objective-c,string,cocoa,camelcasing,Objective C,String,Cocoa,Camelcasing,我正在寻找将字符串从camelback格式转换为Title-Case格式的最简单方法 如何将“playerName”更改为“playerName”?我认为可以使用一些正则表达式来解决这个问题。查看类似问题:尝试使用: string.Split() 然后使用大写字母作为标记虽然有点长,但是NSString的这个类别应该可以做到这一点。它通过了我所有的测试: - (NSString *)splitOnCapital { // Make a index of uppercase characte
如何将“playerName”更改为“playerName”?我认为可以使用一些正则表达式来解决这个问题。查看类似问题:尝试使用:
string.Split()
然后使用大写字母作为标记虽然有点长,但是NSString的这个类别应该可以做到这一点。它通过了我所有的测试:
- (NSString *)splitOnCapital
{
// Make a index of uppercase characters
NSRange upcaseRange = NSMakeRange('A', 26);
NSIndexSet *upcaseSet = [NSIndexSet indexSetWithIndexesInRange:upcaseRange];
// Split our camecase word
NSMutableString *result = [NSMutableString string];
NSMutableString *oneWord = [NSMutableString string];
for (int i = 0; i < self.length; i++) {
char oneChar = [self characterAtIndex:i];
if ([upcaseSet containsIndex:oneChar]) {
// Found a uppercase char, now save previous word
if (result.length == 0) {
// First word, no space in beginning
[result appendFormat:@"%@", [oneWord capitalizedString]];
}else {
[result appendFormat:@" %@", oneWord];
}
// Clear previous word for new word
oneWord = [NSMutableString string];
}
[oneWord appendFormat:@"%c", oneChar];
}
// Add last word
if (oneWord.length > 0) {
[result appendFormat:@" %@", oneWord];
}
return result;
}
-(NSString*)拆分资本
{
//为大写字符编制索引
NSRange upcaseRange=NSMakeRange('A',26);
NSIndexSet*UPCAESET=[NSIndexSet INDEXSETWITHINDEXESINGRANGE:UPCAESERANGE];
//分词
NSMutableString*结果=[NSMutableString];
NSMutableString*oneWord=[NSMutableString];
for(int i=0;i0){
[结果格式:@“%@”,一个字];
}
返回结果;
}
使用NSCharacterSet稍微缩短一点:
__block NSString *str = @"myVerySpecialPlayerName" ;
// split at uppercase letters
NSArray *splitString = [str componentsSeparatedByCharactersInSet:
[NSCharacterSet uppercaseLetterCharacterSet]] ;
// get the uppercase letters
NSArray *upperCaseLetters = [str componentsSeparatedByCharactersInSet:
[[NSCharacterSet uppercaseLetterCharacterSet] invertedSet]] ;
// join with two spaces
str = [splitString componentsJoinedByString:@" "] ;
__block NSInteger offset = 0 ;
// replace each second space with the missing uppercase letter
[upperCaseLetters enumerateObjectsUsingBlock:^(NSString *character, NSUInteger idx, BOOL *stop) {
if( [character length] > 0 ) {
str = [str stringByReplacingCharactersInRange:NSMakeRange(idx+offset+1, 1) withString:character] ;
offset += 2 ;
}
}] ;
// & capitalize the first one
str = [str capitalizedString] ;
NSLog(@"%@", str) ; // "My Very Special Player Name"
NSString*str=@“playerName”;
NSMutableString*str2=[NSMutableString];
对于(NSInteger i=0;i而言,虽然技术上较短,但效率更低
NSString *challengeString = @"playerName";
NSMutableString *rStr = [NSMutableString stringWithString:challengeString];
while ([rStr rangeOfCharacterFromSet:[NSCharacterSet uppercaseLetterCharacterSet]].location != NSNotFound) {
[rStr replaceCharactersInRange:[rStr rangeOfCharacterFromSet:[NSCharacterSet uppercaseLetterCharacterSet]] withString:[[NSString stringWithFormat:@" %@", [rStr substringWithRange:[rStr rangeOfCharacterFromSet:[NSCharacterSet uppercaseLetterCharacterSet]]]] lowercaseString]];
}
NSLog(@"%@", rStr.capitalizedString);
不确定这比websterx短多少,但我发现使用Characteristic Member更容易阅读和理解。还添加了长度检查,以修复字符串以大写开头之前的空格
NSString *str = @"PlayerNameHowAboutALongerString";
NSMutableString *str2 = [NSMutableString string];
for (NSInteger i=0; i<str.length; i++){
unichar ch = [str characterAtIndex:i];
if ( [[NSCharacterSet uppercaseLetterCharacterSet] characterIsMember:ch]) {
if (str2.length > 0 ) {
[str2 appendString:@" "];
}
}
[str2 appendString:[NSString stringWithCharacters:&ch length:1]];
}
NSLog(@"--%@--", str2.capitalizedString);
NSString*str=@“playernamehowaboutalangerstring”;
NSMutableString*str2=[NSMutableString];
对于(NSInteger i=0;i 0){
[str2-appendString:@”“;
}
}
[str2 appendString:[NSString stringWithCharacters:&ch长度:1]];
}
NSLog(@“-%@-”,str2.capitalizedString);
尝试使用正则表达式替换
NSString *modified = [input stringByReplacingOccurrencesOfString:@"([a-z])([A-Z])"
withString:@"$1 $2"
options:NSRegularExpressionSearch
range:NSMakeRange(0, input.length)];
我有一个类似的问题,这里的答案帮助我创建了一个解决方案。我有一个数组,其中有一个标签列表,我想在UITableView中显示,每行一个标签
我的问题是,我从SOAP操作返回的XML中解析了这些标签,但我不知道字符串的格式
首先,我将webstersx answer实现到一个方法中。这很好,但其中一些标签以大写字母开头,一些标签以驼峰大小写开头(例如,一些字符串在exampleLabel
处,另一些字符串在exampleLabel
处)。这意味着以大写字母开头的标签在字符串前面插入了一个空格
我克服了这个问题,使用NSString的stringByTrimmingCharactersInSet
从字符串的开头和结尾修剪空白
下一个问题是所使用的任何缩写,如“ID”或“PNR状态”,其中显示为“ID”和“p N R状态”,作为大写字母,其中非常正确地选择并在其前面插入空格
我克服了这个问题,在我的新方法中实现了一个类似于emdog4答案的正则表达式
以下是我完整的解决方案:
- (NSString *)formatLabel:(NSString *)label
{
NSMutableString *str2 = [NSMutableString string];
for (NSInteger i=0; i<label.length; i++){
NSString *ch = [label substringWithRange:NSMakeRange(i, 1)];
if ([ch rangeOfCharacterFromSet:[NSCharacterSet uppercaseLetterCharacterSet]].location != NSNotFound) {
[str2 appendString:@" "];
}
[str2 appendString:ch];
}
NSString * formattedString = [str2 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]].capitalizedString;
formattedString = [formattedString stringByReplacingOccurrencesOfString:@"([A-Z]) (?![A-Z][a-z])" withString:@"$1" options:NSRegularExpressionSearch range:NSMakeRange(0, formattedString.length)];
return formattedString;
}
将输出:
2013-10-10 10:44:39.888测试项目[28296:a0b]格式标签:PNR状态接受的答案对我不起作用,因为它没有大写第一个字母,如果第一个字母已经大写,它会在开头添加一个额外的空格。这是我的改进版本:
- (NSString *)titleFromCamelCaseString:(NSString *)input
{
NSMutableString *output = [NSMutableString string];
[output appendString:[[input substringToIndex:1] uppercaseString]];
for (NSUInteger i = 1; i < [input length]; i++)
{
unichar character = [input characterAtIndex:i];
if ([[NSCharacterSet uppercaseLetterCharacterSet] characterIsMember:character])
{
[output appendString:@" "];
}
[output appendFormat:@"%C", character];
}
return output;
}
-(NSString*)titleFromCamelCaseString:(NSString*)输入
{
NSMutableString*输出=[NSMutableString];
[output appendString:[[input substringToIndex:1]uppercaseString]];
对于(整数i=1;i<[输入长度];i++)
{
unichar字符=[输入字符索引:i];
如果([[NSCharacterSet uppercaseLetterCharacterSet]特征成员:字符])
{
[输出追加字符串:@”“;
}
[输出格式:@“%C”,字符];
}
返回输出;
}
如果任何人需要Swift版本:
func camelCaseToTitleCase(s: NSString) -> String {
var newString = ""
if s.length > 0 {
newString = s.substringToIndex(1).uppercaseString
for i in 1..<s.length {
let char = s.characterAtIndex(i)
if NSCharacterSet.uppercaseLetterCharacterSet().characterIsMember(char) {
newString += " "
}
newString += s.substringWithRange(NSRange(location: i, length: 1))
}
}
return newString
}
func camelCaseToTitleCase(s:NSString)->String{
var newString=“”
如果s.length>0{
newString=s.substringToIndex(1).大写字符串
这里是Swift代码(webstersx的目标c代码),谢谢
var str: NSMutableString = "iLoveSwiftCode"
var str2: NSMutableString = NSMutableString()
for var i:NSInteger = 0 ; i < str.length ; i++ {
var ch:NSString = str.substringWithRange(NSMakeRange(i, 1))
if(ch .rangeOfCharacterFromSet(NSCharacterSet.uppercaseLetterCharacterSet()).location != NSNotFound) {
str2 .appendString(" ")
}
str2 .appendString(ch)
}
println("\(str2.capitalizedString)")
}
var-str:NSMutableString=“iLoveSwiftCode”
var str2:NSMutableString=NSMutableString()
对于变量i:NSInteger=0;i
这是一个更简单的Swift版本。我已经将它添加到一个扩展中
extension String {
func stringFromCamelCase() -> String {
var string = self
string = string.stringByReplacingOccurrencesOfString("([a-z])([A-Z])", withString: "$1 $2", options: NSStringCompareOptions.RegularExpressionSearch, range: Range<String.Index>(start: string.startIndex, end: string.endIndex))
string.replaceRange(startIndex...startIndex, with: String(self[startIndex]).capitalizedString)
return string
}
}
NSString*input=@“playerName”;
NSString*MODIFED=[input StringByReplacingOfString:@'(?Swift 2.2下的另一个解决方案
extension String {
var stringFromCamelCase:String {
return (self as NSString).replacingOccurrences(
of: "([a-z])([A-Z])",
with: "$1 $2",
options: CompareOptions.regularExpressionSearch,
range: NSMakeRange(0, self.characters.count)
).uppercaseFirst
}
var uppercaseFirst: String {
return String(characters.prefix(1)).uppercased() + String(characters.dropFirst()).lowercased()
}
}
尝试更符合unicode标准
extension String {
func camelCaseToTitleCase() -> String {
return unicodeScalars.map(replaceCaptialsWithSpacePlusCapital).joined().capitalized
}
private func replaceCaptialsWithSpacePlusCapital(unichar: UnicodeScalar) -> String {
if CharacterSet.uppercaseLetters.contains(unichar) {
return " \(unichar)"
}
return "\(unichar)"
}
}
使用哪种语言?(cocoa不是API而是语言吗?)字符串非常特定于语言。做得很好!是的,这肯定很短!我在这里传递接受的答案,除非其他人能想出一个较短的方法。我认为还有一个较短的方法可以做到这一点…其他的方法对于这样一个简单的任务来说太长了:/此解决方案根本不处理表情符号和它N如果第一个字符是大写字母,则在第一个字符前插入空格。@orj只需将字符集从[NSCharacterSet uppercaseLetterCharacterSet]更改为您根据需要派生的字符集w!一行!N
var str = "helloWorld"
str = str.stringFromCamelCase()
NSString *input = @"playerName";
NSString *modified = [input stringByReplacingOccurrencesOfString:@"(?<!^)[A-Z]" withString:@" $0" options:NSRegularExpressionSearch range:NSMakeRange(0, input.length)].capitalizedString;
extension String {
var stringFromCamelCase:String {
return (self as NSString).replacingOccurrences(
of: "([a-z])([A-Z])",
with: "$1 $2",
options: CompareOptions.regularExpressionSearch,
range: NSMakeRange(0, self.characters.count)
).uppercaseFirst
}
var uppercaseFirst: String {
return String(characters.prefix(1)).uppercased() + String(characters.dropFirst()).lowercased()
}
}
extension String {
func camelCaseToTitleCase() -> String {
return unicodeScalars.map(replaceCaptialsWithSpacePlusCapital).joined().capitalized
}
private func replaceCaptialsWithSpacePlusCapital(unichar: UnicodeScalar) -> String {
if CharacterSet.uppercaseLetters.contains(unichar) {
return " \(unichar)"
}
return "\(unichar)"
}
}