2011-09-06 35 views
7

Cách nào hiệu quả nhất để chuyển đổi chuỗi như "ThisStringIsJoined" thành "Chuỗi này được tham gia" trong mục tiêu-c?Chèn hoặc tách chuỗi tại các chữ cái hoa tiêu target-c

Tôi nhận các chuỗi như thế này từ một dịch vụ web ngoài tầm kiểm soát của tôi và tôi muốn hiển thị dữ liệu cho người dùng, vì vậy tôi chỉ muốn dọn dẹp một chút bằng cách thêm dấu cách vào trước mỗi từ viết hoa. Các chuỗi luôn luôn được định dạng với mỗi từ bắt đầu bằng một chữ hoa.

Tôi khá mới với mục tiêu-c nên không thể thực sự tìm ra điều này.

Cảm ơn

+0

có thể trùng lặp: http: // stackoverflow.com/questions/1588205/how-to-split-a-string-với-the-hoa-ký tự-trong-iphone – 0x8badf00d

Trả lời

34

Một cách để đạt được điều này là như sau:

NSString *string = @"ThisStringIsJoined"; 
NSRegularExpression *regexp = [NSRegularExpression 
    regularExpressionWithPattern:@"([a-z])([A-Z])" 
    options:0 
    error:NULL]; 
NSString *newString = [regexp 
    stringByReplacingMatchesInString:string 
    options:0 
    range:NSMakeRange(0, string.length) 
    withTemplate:@"$1 $2"]; 
NSLog(@"Changed '%@' -> '%@'", string, newString); 

Sản lượng trong trường hợp này sẽ là:

'ThisStringIsJoined' -> 'This String Is Joined' 

Bạn có thể muốn tinh chỉnh các biểu thức chính quy để bạn sở hữu nhu cầu . Bạn có thể muốn biến điều này thành một danh mục trên NSString.

+0

Cảm ơn bạn, nó hoạt động tuyệt vời – Craigt

+1

@aLevelOfIndirection Cảm ơn bạn, đã hoạt động như một nét duyên dáng – death7eater

+0

Tôi có thể thêm gì ở đây để loại trừ thêm không gian giữa các từ viết tắt? như HelloHTML Goodbye có nên chào tạm biệt Xin chào HTML không? – userx

-1

Bạn có thể thử tạo chuỗi mới là bản sao thường của chuỗi gốc. Sau đó so sánh hai chuỗi và chèn khoảng trống vào bất cứ nơi nào các ký tự khác nhau.

Sử dụng phương pháp NSString để chuyển sang chữ thường.

- (NSString *)lowercaseString 
9

NSRegularExpression s là con đường để đi, nhưng như đố, NSCharacterSet cũng có thể hữu ích:

- (NSString *)splitString:(NSString *)inputString { 

    int index = 1; 
    NSMutableString* mutableInputString = [NSMutableString stringWithString:inputString]; 

    while (index < mutableInputString.length) { 

     if ([[NSCharacterSet uppercaseLetterCharacterSet] characterIsMember:[mutableInputString characterAtIndex:index]]) { 
      [mutableInputString insertString:@" " atIndex:index]; 
      index++; 
     } 
     index++; 
    } 

    return [NSString stringWithString:mutableInputString]; 
} 
+0

Giải pháp tuyệt vời !!! – user523234

+0

Có ai kiểm tra xem giải pháp RegularExpression có chậm hơn không? – Daniel

1

Dưới đây là một thể loại trên NSString rằng sẽ làm những gì bạn muốn. Điều này sẽ xử lý các chữ cái không phải ASCII. Nó cũng sẽ tách "IDidAGoodThing" đúng cách.

@implementation NSString (SeparateCapitalizedWords) 

-(NSString*)stringBySeparatingCapitalizedWords 
{ 
    static NSRegularExpression * __regex ; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     NSError * error = nil ; 
     __regex = [ NSRegularExpression regularExpressionWithPattern:@"[\\p{Uppercase Letter}]" options:0 error:&error ] ; 
     if (error) { @throw error ; } 
    }); 

    NSString * result = [ __regex stringByReplacingMatchesInString:self options:0 range:(NSRange){ 1, self.length - 1 } withTemplate:@" $0" ] ; 
    return result ; 
} 

@end 
1

Đây là mã Swift (mã c mục tiêu của webstersx), Cảm ơn!

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)") 

    } 

Output: I Love Mã Swift

+0

nếu chuỗi đầu vào bắt đầu bằng ký tự chữ hoa, điều này sẽ thêm một khoảng trắng. – alexkent

0

Đối với bất cứ ai đến đây tìm kiếm các câu hỏi tương tự đã trả lời trong Swift: Có lẽ một trình dọn dẹp (thêm vào câu trả lời Sankalp của), và nhiều hơn nữa 'Swifty 'cách tiếp cận:

func addSpaces(to givenString: String) -> String{ 
    var string = givenString 

    //indexOffset is needed because each time replaceSubrange is called, the resulting count is incremented by one (owing to the fact that a space is added to every capitalised letter) 
    var indexOffset = 0 
    for (index, character) in string.characters.enumerated(){ 
     let stringCharacter = String(character) 

     //Evaluates to true if the character is a capital letter 
     if stringCharacter.lowercased() != stringCharacter{ 
      guard index != 0 else { continue } //"ILoveSwift" should not turn into " I Love Swift" 
      let stringIndex = string.index(string.startIndex, offsetBy: index + indexOffset) 
      let endStringIndex = string.index(string.startIndex, offsetBy: index + 1 + indexOffset) 
      let range = stringIndex..<endStringIndex 
      indexOffset += 1 
      string.replaceSubrange(range, with: " \(stringCharacter)") 
     } 
    } 
    return string 
} 

Bạn gọi hàm như sau:

var string = "iLoveSwiftCode" 
addSpaces(to: string) 
//Result: string = "i Love Swift Code" 

Ngoài ra, nếu bạn thích phần mở rộng:

extension String{ 
    mutating func seperatedWithSpaces(){ 
     //indexOffset is needed because each time replaceSubrange is called, the resulting count is incremented by one (owing to the fact that a space is added to every capitalised letter) 
     var indexOffset = 0 
     for (index, character) in characters.enumerated(){ 
      let stringCharacter = String(character) 

      if stringCharacter.lowercased() != stringCharacter{ 
       guard index != 0 else { continue } //"ILoveSwift" should not turn into " I Love Swift" 
       let stringIndex = self.index(self.startIndex, offsetBy: index + indexOffset) 
       let endStringIndex = self.index(self.startIndex, offsetBy: index + 1 + indexOffset) 
       let range = stringIndex..<endStringIndex 
       indexOffset += 1 
       self.replaceSubrange(range, with: " \(stringCharacter)") 
      } 
     } 
    } 
} 

Gọi phương thức từ một chuỗi:

var string = "iLoveSwiftCode" 
string.seperatedWithSpaces() 
//Result: string = "i Love Swift Code" 
Các vấn đề liên quan