2012-06-15 49 views
6

Như tiêu đề gợi ý, tôi muốn lấy từ cuối cùng ra khỏi một NSString. Tôi nghĩ sử dụng mã này:Lấy từ cuối cùng của số NSString

NSArray *listItems = [someNSStringHere componentsSeparatedByString:@" "]; 
NSString *lastWordString = [NSString stringWithFormat:@"%@", listItems.lastObject]; 
anotherNSStringHere = lastWordString; 

Nhưng tôi nghĩ rằng NSArray sẽ mất một thời gian để tải nếu nó lớn (và nó là lớn), và nó sẽ không nhận ra một từ cách nhau bởi dấu phẩy.

Cảm ơn bạn đã trợ giúp!

Trả lời

27

Nếu bạn muốn trở thành siêu mạnh mẽ:

__block NSString *lastWord = nil; 

[someNSStringHere enumerateSubstringsInRange:NSMakeRange(0, [someNSStringHere length]) options:NSStringEnumerationByWords | NSStringEnumerationReverse usingBlock:^(NSString *substring, NSRange subrange, NSRange enclosingRange, BOOL *stop) { 
    lastWord = substring; 
    *stop = YES; 
}]; 

(Điều này cũng sẽ làm việc với các ngôn ngữ phi La Mã; iOS 4 +/OS X 10.6+.)

Lời giải thích cơ bản:

-enumerateSubstringsInRage:options:usingBlock: thực hiện những gì nó nói trên tin: nó liệt kê các chất nền, được xác định bởi những gì bạn chuyển vào làm tùy chọn. NSStringEnumerationByWords nói "Tôi muốn các từ được trao cho tôi" và NSStringEnumerationReverse nói "bắt đầu ở cuối chuỗi thay vì bắt đầu".

Vì chúng ta đang bắt đầu từ cuối cùng, từ đầu tiên ban cho chúng ta trong substring sẽ là từ cuối cùng trong chuỗi, vì vậy chúng tôi thiết lập lastWord đó, và sau đó thiết lập các BOOL trỏ đến bởi stop YES, vì vậy điều tra dừng ngay lập tức.

lastWord là tất nhiên định nghĩa là __block vì vậy chúng tôi có thể thiết lập nó bên trong khối và nhìn thấy nó bên ngoài, và nó khởi tạo nil vì vậy nếu chuỗi không lời (ví dụ, nếu nó rỗng hoặc là tất cả dấu chấm câu), chúng tôi đừng đổ vỡ khi chúng tôi cố gắng sử dụng lastWord.

+0

Bạn có thể giải thích một chút không? –

+0

Chắc chắn. Hãy để tôi cập nhật bài đăng của mình. – Wevah

+0

Cảm ơn bạn rất nhiều vì đã giải thích! –

0

Bạn có thể đọc các ký hiệu từ cuối chuỗi và sao chép chúng ở chỉ mục 0 để tạo chuỗi. Cho dù bạn đọc dấu cách hay dấu phẩy, chuỗi kết quả sẽ chứa từ cuối cùng

1

Cách hiệu quả nhất có thể bắt đầu ở cuối chuỗi, kiểm tra từng ký tự để xem đó có phải là một phần của từ bạn định nghĩa hay không sau đó trích xuất từ ​​bạn muốn sử dụng substringFromIndex: hoặc substringWithRange:.

11

này cung cấp cho một thử:

NSRange range = [someNSStringHere rangeOfString:@" " options:NSBackwardsSearch]; 
NSString *result = [someNSStringHere substringFromIndex:range.location+1]; 
+0

Tôi đồng ý. Bắt đầu từ cuối, một ký tự tại một thời điểm, cho đến khi bạn đạt đến một dấu cách, dấu phẩy hoặc bất kỳ dấu tách nào khác mà bạn có thể thấy trước. –

+1

Nếu không tìm thấy '@" ", bạn có thể muốn sử dụng chuỗi đầy đủ để thay thế. Tôi sẽ làm điều này: 'NSRange range = [someString rangeOfString: @" "options: NSBackwardsSearch]; NSString * lastWord = someString; if (range.location! = NSNotFound) {lastWord = [tự substringFromIndex: range.location + 1]; } '. –

0

Bạn có thể sử dụng NSString 's chức năng rangeOfSubstring:options: để xác định nó. Ví dụ:

Tìm chuỗi cho không gian, sử dụng tùy chọn tìm kiếm ngược để bắt đầu tìm kiếm từ cuối chuỗi.

NSRange r = [string rangeOfString:@" " options:NSBackwardsSearch];

Điều này sẽ tìm vị trí của từ cuối cùng của chuỗi. Bây giờ chỉ cần có được chuỗi sử dụng substringWithRange: Ví dụ:

NSRange found = NSMakeRange(NSMaxRange(r), string.length - NSMaxRange(r)); NSString *foundString = [string substringWithRange:found];

đâu r là phạm vi từ trước đó.

Cũng hãy cẩn thận để đảm bảo rằng bạn kiểm tra r thực sự tồn tại. Nếu chỉ có 1 từ trong chuỗi, thì r sẽ là {NSNotFound, 0}

Hy vọng tôi có thể trợ giúp!

Bến

2

Nếu bạn muốn sử dụng cụm từ thông dụng (có thể hữu ích nếu bạn muốn bắt đầu phức tạp hơn về những gì bạn đang tìm kiếm ở cuối chuỗi), bạn có thể làm như sau:

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\S+\\Z" options:0 error:nil]; 
NSTextCheckingResult *found = [regex firstMatchInString:inputString options:0 range:NSMakeRange(0, [inputString length])]; 

if (found.range.location != NSNotFound) 
    result = [inputString substringWithRange:found.range]; 
3

Điều đó hoạt động tốt vì nó cũng nhận ra các ký hiệu như @ và # enumerateSubstringsInRange: không hoạt động.

NSCharacterSet *charSet = [NSCharacterSet whitespaceAndNewlineCharacterSet]; 
NSArray *components = [someString componentsSeparatedByCharactersInSet:charSet]; 
NSString *lastWord = components.lastObject; 
Các vấn đề liên quan