2009-02-27 45 views
15

Tôi vừa đọc số docu của Apple về NSScanner. Tôi đang cố lấy số nguyên của chuỗi đó: @ "người dùng đã đăng nhập (3 lần thử)".Làm thế nào để sử dụng NSScanner?

Tôi không thể tìm thấy bất kỳ ví dụ nào, cách quét trong ngoặc đơn. Bất kỳ ý tưởng?

Dưới đây là các mã:

NSString *logString = @"user logged (3 attempts)"; 
NSScanner *aScanner = [NSScanner scannerWithString:logString]; 

[aScanner scanInteger:anInteger]; 

NSLog(@"Attempts: %i", anInteger); 

Trả lời

16

'Dưới đây là những gì tôi làm để có được giá trị nhất định ra khỏi một chuỗi

Trước tiên tôi có phương pháp này được xác định

- (NSString *)getDataBetweenFromString:(NSString *)data leftString:(NSString *)leftData rightString:(NSString *)rightData leftOffset:(NSInteger)leftPos; 
{   
    NSInteger left, right;   
    NSString *foundData; 
    NSScanner *scanner=[NSScanner scannerWithString:data];     
    [scanner scanUpToString:leftData intoString: nil];   
    left = [scanner scanLocation];   
    [scanner setScanLocation:left + leftPos];   
    [scanner scanUpToString:rightData intoString: nil];   
    right = [scanner scanLocation] + 1;   
    left += leftPos;   
    foundData = [data substringWithRange: NSMakeRange(left, (right - left) - 1)];   return foundData; 
} 

Sau đó gọi nó.

foundData = [self getDataBetweenFromString:data leftString:@"user logged (" rightString:@"attempts)" leftOffset:13]; 

leftOffset là số ký tự cho chuỗi trái

thể là một cách dễ dàng hơn sạch hơn nhưng đó là giải pháp của tôi.

+1

bạn không cần leftPos. Điều này có thể được tìm thấy bằng cách sử dụng cuộc gọi [lengthData length]. Tuy nhiên, điều này là rất tốt cho việc thu thập dữ liệu giữa các chuỗi động. +1 – KronoS

+0

@Kalle: 'NULL' và' nil' được xác định chính xác giống nhau, nhưng có ý nghĩa khác nhau. Trong trường hợp này 'nil' là đúng. http://stackoverflow.com/questions/1841983/what-describes-nil-best-whats-that-really/1843034#1843034 –

+0

Cảm ơn vì điều đó - Tôi đã xóa nhận xét được đề cập. Có, NULL và nil là giống hệt nhau. – Kalle

5

NSScanner là máy quét tuyến tính. Bạn phải quét qua những thứ bạn không muốn nhận được những gì bạn muốn.

Bạn có thể làm [aScanner scanUpToCharactersInSet:[NSCharacterSet decimalDigitCharacterSet] intoString:NULL] để chuyển qua mọi thứ cho đến ký tự số. Sau đó, bạn thực hiện [aScanner scanInteger:&anInteger] để quét ký tự vào một số nguyên.

50

Giải pháp của Ziltoid hoạt động nhưng có nhiều mã hơn bạn cần.

Tôi sẽ không làm phiền việc tạo NSScanner cho tình huống đã cho. NSCharacterSet và NSString cung cấp cho tất cả các bạn bạn cần:

NSString *logString = @"user logged (3 attempts)"; 
    NSString *digits = [logString stringByTrimmingCharactersInSet: 
     [[NSCharacterSet decimalDigitCharacterSet] invertedSet]]; 
    NSLog(@"Attempts: %i", [digits intValue]); 

hoặc trong Swift: (! Vâng, @NSResponder có một giải pháp thực sự gọn gàng)

let logString = "user logged (3 attempts)" 
    let nonDigits = NSCharacterSet.decimalDigitCharacterSet().invertedSet 
    let digits : NSString = logString.stringByTrimmingCharactersInSet(nonDigits) 
    NSLog("Attempts: %i", digits.intValue) 
+3

'invertedSet' đẹp! Tôi không biết phương pháp đó. Tôi không thể nhớ làm thế nào tôi đã giải quyết vấn đề này trước đây, nhưng nó chắc chắn không phải là thanh lịch như thế này. – kubi

5

Đây là một giải pháp đơn giản sử dụng NSScanner:

sản lượng
NSString *logString = @"user logged (3 attempts)"; 
NSString *numberString; 
NSScanner *scanner = [NSScanner scannerWithString:logString]; 
[scanner scanUpToCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet] intoString:nil]; 
[scanner scanCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet] intoString:&numberString]; 
NSLog(@"Attempts: %i", [numberString intValue]); 

NSLog:

Attempts: 3 
1

đây là cách sử dụng reg-ex

NSString *logString = @"user logged (3 attempts)"; 
NSString * digits = [logString stringByMatching:@"([+\\-]?[0-9]+)" capture:1]; 
Các vấn đề liên quan