2013-01-08 36 views
5

Cách hiệu quả nhất để chia chuỗi thành hai phần, theo cách sau:Xóa từ cuối cùng trong một chuỗi trong Mục tiêu-c

Một phần là chuỗi cuối cùng của ký tự sau khoảng trắng cuối cùng trong chuỗi Phần thứ hai là phần còn lại của chuỗi

ví dụ "This is a sentence" một phần: "câu" Phần thứ hai: "Đây là một" // Lưu ý có khoảng trắng ở phần cuối của chuỗi này

"This is a" một phần: "" phần thứ hai: "This is a"

+1

Hãy xem câu trả lời của Barry tại đây ... http://stackoverflow.com/ câu hỏi/1752946/how-to-get-the-first-n-words-từ-a-nsstring-in-goal-c –

Trả lời

6

Bạn có muốn loại bỏ từ cuối cùng, nói về mặt ngữ nghĩa, hay bạn muốn để cắt tất cả mọi thứ ra sau khi nhân vật khoảng trắng cuối cùng, đó là những gì bạn mô tả? Tôi hỏi vì họ không thực sự giống nhau, tùy thuộc vào ngôn ngữ của văn bản.

Nếu bạn muốn tắt tất cả mọi thứ sau bit cuối cùng của khoảng trắng, các câu trả lời khác ở đây sẽ làm bạn tốt. Nhưng nếu bạn muốn cắt bỏ từ cuối cùng, thì bạn cần đào sâu hơn một chút và sử dụng API liệt kê từ:

NSString *removeLastWord(NSString *str) { 
    __block NSRange lastWordRange = NSMakeRange([str length], 0); 
    NSStringEnumerationOptions opts = NSStringEnumerationByWords | NSStringEnumerationReverse | NSStringEnumerationSubstringNotRequired; 
    [str enumerateSubstringsInRange:NSMakeRange(0, [str length]) options:opts usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) { 
     lastWordRange = substringRange; 
     *stop = YES; 
    }]; 
    return [str substringToIndex:lastWordRange.location]; 
} 
+0

+1. Bạn có cần phải bao gồm NSStringEnumerationLocalized, tuy nhiên, để có được các ranh giới từ địa phương cụ thể? –

+0

Cảm ơn. Có, tôi đã tìm cách cắt bỏ mọi thứ sau ký tự khoảng trắng cuối cùng (newLine) – user462455

+0

@JesseRusak: Mô tả cho hằng số đó nói rằng nó sử dụng ngôn ngữ của người dùng. Có lẽ, để nó tắt có nghĩa là nó tự động phát hiện ngôn ngữ từ văn bản. –

0

Bạn có thể sử dụng -[NSString componentsSeparatedByString:]-[NSArray componentsJoinedByString:] tách một chuỗi thành các thành phần riêng lẻ (từ) và ngược lại:

NSString *sentence = @"This is a sentence"; 
NSLog(@"Sentence: \"%@\"", sentence); 
NSCharacterSet *whitespace = [NSCharacterSet whitespaceCharacterSet]; 
sentence = [sentence stringByTrimmingCharactersInSet:whitespace]; 

NSMutableArray *words = [[sentence componentsSeparatedByCharactersInSet:whitespace] mutableCopy]; 
NSString *lastWord = [words lastObject]; 
[words removeLastObject]; 
NSString *firstPart = [words componentsJoinedByString:@" "]; 

NSLog(@"Last word: \"%@\" First part: \"%@\"", lastWord, firstPart); 

Output:

2013-01-07 18:36:50.566 LastWord[42999:707] Sentence: "This is a sentence" 
2013-01-07 18:36:50.569 LastWord[42999:707] Last word: "sentence" First part: "This is a" 

Mã này giả định một số điều cần lưu ý. Đầu tiên, nó cắt bớt khoảng trống bạn đã đề cập ở đầu/cuối của câu, nhưng không bảo toàn nó. Vì vậy, nếu khoảng trắng đó thực sự quan trọng đối với bạn, bạn sẽ phải tính đến. Ngoài ra, nó không làm bất cứ điều gì đặc biệt nếu câu là trống hoặc chỉ chứa một từ (nó an toàn theo cách này, chỉ cần không đặc biệt phức tạp).

+0

Cảm ơn. Có cách nào để đạt được điều này bằng cách xử lý cả khoảng trắng và ký tự dòng mới, thay vì chỉ khoảng trắng – user462455

+0

Có, có. Thay đổi 'NSCharacterSet * khoảng trắng = [NSCharacterSet whitespaceCharacterSet];' thành 'NSCharacterSet * khoảng trắng = [NSCharacterSet khoảng trắngAndNewlineCharacterSet];' –

16

Hãy thử một cái gì đó như thế này:

NSString* str= @"this is a sentence"; 

// Search from back to get the last space character 
NSRange range= [str rangeOfString: @" " options: NSBackwardsSearch]; 

// Take the first substring: from 0 to the space character 
NSString* str1= [str substringToIndex: range.location]; // @"this is a" 

// take the second substring: from after the space to the end of the string 
NSString* str2= [str substringFromIndex: range.location+1]; // @"sentence" 
+0

rất đẹp và rõ ràng – hariszaman

Các vấn đề liên quan