2013-04-17 38 views
6

Đây là các mẫu NSStrings của tôi (được phân tích thành một mảng), được đơn giản hóa.Trích xuất các giá trị đơn lẻ từ một NSString được phân tích cú pháp trong mục tiêu-c

Đối tượng chuỗi duy nhất được phân tích như "STRING1, STRING2 sau đó NGÀY THỜI GIAN sau đó - A: VALUE", ví dụ:

The name of first value, first 17/04/2013 11:30:00 - A:30.0 // sometimes there is a comma after first string 
The name of second value 17/04/2013 11:00:00 - A:20.0 // sometimes there is NOT a comma after first string 
Name of third value 17/04/2013 10:30:00 - A:40.0 
Fourth 17/04/2013 09:40:00 - A:50.0 
Fifth value 17/04/2013 05:00:00 - A:10.0 

Vâng, tôi cần phải trích xuất các giá trị riêng của STRING hoặc STRING, STRING:

The name of first value, first 
The name of second value 
Name of third value 
Fourth 
Fifth value 

sau đó DATE và TIME

17/04/2013 11:30:00 
17/04/2013 11:00:00 
17/04/2013 10:30:00 
17/04/2013 09:40:00 
17/04/2013 05:00:00 

cuối cùng, GIÁ TRỊ duy nhất:

30.0 
20.0 
40.0 
50.0 
10.0 

EDIT: Tôi đang cố gắng sử dụng một mã từ Martin R cho phân tích cú pháp * allValues ​​tôi:

The *allValues array is something like: 
    (
     "The name of first value, first 17/04/2013 11:30:00 - A:30.0", 
     "The name of second value 17/04/2013 11:00:00 - A:20.0", 
     "Name of third value 17/04/2013 10:30:00 - A:40.0", 
     "Fourth 17/04/2013 09:40:00 - A:50.0", 
     "Fifth value 17/04/2013 05:00:00 - A:10.0" 
    ) 

và đây là đoạn code để trích xuất các giá trị duy nhất:

NSMutableArray *allValues = [parsedFeed valueForKey:@"values"]; 

for (int i=1; i < [allValues count]; i++) { 
    NSString *string = [allValues objectAtIndex:i]; 
    NSString *pattern = @"(.*) (\\d{2}/\\d{2}/\\d{4} \\d{2}:\\d{2}:\\d{2}) - A:(.*)"; 
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:NULL]; 
    NSTextCheckingResult *match = [regex firstMatchInString:string options:0 range:NSMakeRange(0, [string length])]; 

    if (match != nil) { 
    NSString *s1 = [string substringWithRange:[match rangeAtIndex:1]]; 
    NSString *s2 = [string substringWithRange:[match rangeAtIndex:2]]; 
    NSString *s3 = [string substringWithRange:[match rangeAtIndex:3]]; 
    NSLog(@"First part: %@", s1); 
    NSLog(@"Second part: %@", s2); 
    NSLog(@"Third part: %@", s3); 
    } 
} 

Nhưng trong trường hợp này tôi không thể nhận được bất kỳ kết quả NSLog nào (match == nil). Chuyện gì vậy? Cảm ơn!

+0

(http: // whathaveyoutried. com) Chúng tôi không ở đây để giải quyết vấn đề của bạn cho bạn nhưng để giúp bạn với các vấn đề cụ thể mà bạn đang mắc kẹt trong khi cố gắng giải quyết vấn đề. Bạn cũng có thể muốn xem [FAQ] (http://stackoverflow.com/questions/how-to-ask) –

Trả lời

12

Nếu NGÀY/GIỜ có một định dạng cố định, bạn có thể sử dụng một biểu thức chính quy:

NSString *string = @"The name of first value, first 17/04/2013 11:30:00 - A:30.0"; 
NSString *pattern = @"(.*) (\\d{2}/\\d{2}/\\d{4} \\d{2}:\\d{2}:\\d{2}) - A:(.*)"; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern 
             options:0 error:NULL]; 
NSTextCheckingResult *match = [regex firstMatchInString:string options:0 range:NSMakeRange(0, [string length])]; 
if (match != nil) { 
    NSString *s1 = [string substringWithRange:[match rangeAtIndex:1]]; 
    NSString *s2 = [string substringWithRange:[match rangeAtIndex:2]]; 
    NSString *s3 = [string substringWithRange:[match rangeAtIndex:3]]; 
    NSLog(@"First part: %@", s1); 
    NSLog(@"Second part: %@", s2); 
    NSLog(@"Third part: %@", s3); 
} 

Output: [? Bạn đã làm gì cố gắng]

 
First part: The name of first value, first 
Second part: 17/04/2013 11:30:00 
Third part: 30.0 
+0

Cảm ơn bạn rất nhiều @Martin R, mã của bạn là hoàn hảo cho MỘT chuỗi cố định, nhưng nếu bạn thấy EDIT trên câu hỏi của tôi, tôi không thể sử dụng nó để trích xuất các giá trị từ các chuỗi của một NSMutableArray ... là có một số vấn đề? – Huxley

+0

@ Huxley: Lưu ý rằng vòng lặp của bạn bắt đầu bằng chỉ mục 1 thay vì 0 và chuỗi đầu tiên của bạn sử dụng dấu chấm (.) Và không phải dấu hai chấm (:) trong trường thời gian. Regex của tôi kiểm tra dấu hai chấm. Người ta có thể khái quát hóa nó để kiểm tra dấu chấm hoặc dấu hai chấm. - Ngoài ra, tôi không thấy vấn đề với mảng và mã EDITED của bạn hoạt động mà không gặp sự cố trong ứng dụng thử nghiệm của tôi. –

+0

Tuyệt vời, Martin, đó là lỗi đánh máy! :) Cuối cùng gấp đôi, whats cách để "generalize" kiểm tra cho dấu chấm hoặc ruột kết, ví dụ, u có thể cung cấp mã? Cám ơn bạn một lần nữa! – Huxley

-1

Có rất nhiều phương pháp khác nhau do Lớp NSString cung cấp để thực hiện những gì bạn muốn. Tìm, Kết hợp và Phân chia các chuỗi và các đoạn. có một cái nhìn tại các phương pháp này, tôi chắc chắn bạn có thể kết hợp chúng để có được các chuỗi bạn muốn. Tôi nghĩ rằng bạn sẽ cần một số if() khác niềng răng mặc dù.

http://developer.apple.com/library/ios/#Documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html

Hy vọng bạn này sẽ giúp bạn.