2010-08-21 64 views
7

Tôi đang tìm cách tốt nhất để kiểm tra xem NSString có chứa cả ký tự số và chữ cái hay không. Những gì tôi đã đưa ra cho đến nay là mã bên dưới nhưng điều này chỉ cho tôi biết rằng không có ký tự nào được nhập không phải là số hoặc chữ cái.Kiểm tra NSString chứa cả chữ cái và số

if([[myNSString stringByTrimmingCharactersInSet: 
      [NSCharacterSet alphanumericCharacterSet]] isEqualToString:@""]){  
    //The string only contains alpha or numerical characters. 
    //But now I want to check that both character sets are present ?  
} 
+0

Tôi biết rằng đó là dị giáo để nói điều này nhưng cách đơn giản nhất, dễ hiểu nhất và hiệu quả nhất để làm điều này gần như chắc chắn là chỉ lặp qua chuỗi, trích xuất từng ký tự bằng 'characterAtIndex' và kiểm tra nó dựa vào các giới hạn thích hợp . Với những người khác, bạn nên có một số nhận xét khá darn tốt nếu bạn muốn hiểu mã 6 tháng kể từ bây giờ. –

Trả lời

14

Chỉ cần cắt letterCharacterSet và decimalDigitCharacterSet và kiểm tra xem chuỗi sản xuất là không bằng với chuỗi gốc:

if (![[myOriginalString stringByTrimmingCharactersInSet:[NSCharacterSet decimalDigitCharacterSet]] isEqualToString:myOriginalString] 
    && ![[myOriginalString stringByTrimmingCharactersInSet:[NSCharacterSet letterCharacterSet]] isEqualToString:myOriginalString]) { 
... 
} 
+0

Cảm ơn bạn. Vâng, đây là những gì tôi đã làm cuối cùng. – ADude

+0

những thứ tuyệt vời! – jianpx

+0

phát hiện lỗi: nếu chuỗi chứa ký tự điều khiển, nó trả về CÓ, điều đó sai. – jianpx

5

câu trả lời kovpas' hoạt động tốt nếu bạn có chữ ở đầu hoặc cuối và chữ số trên ngược lại. Một vấn đề xảy ra nếu chữ số được nhúng giữa các chữ cái hoặc ngược lại, chẳng hạn như 'abc123abc'. Đây là một giải pháp:

if (![[[str componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""] isEqualToString:str] 
    && ![[[str componentsSeparatedByCharactersInSet:[[NSCharacterSet letterCharacterSet] invertedSet]] componentsJoinedByString:@""] isEqualToString:str]) { 
    .... 
} 
+0

câu trả lời này hoạt động tốt hơn nhiều! Tôi không chắc chắn lý do tại sao bạn đang sử dụng 'invertedSet' mặc dù. Cảm ơn – Ezeki

+0

Bí quyết cho vấn đề này là nó phức tạp hơn để kiểm tra xác nhận. Việc kiểm tra đầu tiên xây dựng một chuỗi không có chữ số; nếu chuỗi giống hệt với bản gốc, thì không có chữ số nào trong chuỗi. Một kiểm tra tương tự được thực hiện với kiểm tra thứ hai cho các chữ cái. Đây là lý do tại sao KHÔNG có cho 2 điều kiện. – Amory

+0

có, nhưng bạn không cần sử dụng 'invertedSet', nó hoạt động hoàn hảo ngay cả khi không có nó – Ezeki

4

Tôi không chắc hai câu trả lời trước đây bao gồm các yêu cầu, vì vậy đây là câu trả lời tương ứng với cách giải thích chặt chẽ hơn các yêu cầu.

Lấy các yêu cầu từ các chú thích trong mã của các bài bản gốc:

//The string only contains alpha or numerical characters. 
//But now I want to check that both character sets are present? 

Điều này có nghĩa rằng một chuỗi để vượt qua các thử nghiệm phải bao gồm chỉ số và chữ cái và ít nhất một trong mỗi.

NSString 's rangeOfCharacterFromSet: tìm một ký tự trong một chuỗi nếu thuộc về một tập hợp nhất định, vì vậy chúng tôi có thể sử dụng một ký tự đó.

NSString *string = // ... string to test; 

NSCharacterSet *illegalChars = [[NSCharacterSet alphanumericCharacterSet] invertedSet]; 

// Test if there is an illegal character in the string 
BOOL hasIllegalCharacter = [string rangeOfCharacterFromSet: illegalCharacterSet].location != NSNotFound; 

BOOL hasLetter = [string rangeOfCharacterFromSet: [NSCharacterSet letterCharacterSet]].location != NSNotFound; 

BOOL hasDigit = [string rangeOfCharacterFromSet: [NSCharacterSet decimalDigitCharacterSet]].location != NSNotFound; 

if (hasDigit && hasLetter && !hasIllegalCharacter ) { 
    // String OK 
} 

Như đã trình bày trong các tài liệu, các rangeOfCharacterFromSet: trả về một NSRange của {NSNotFound, 0} trong trường hợp không có nhân vật từ bộ được tìm thấy trong chuỗi. Điều này tương tự như các phương pháp khác để tìm kiếm chuỗi hoặc ký tự trong một chuỗi trong Cocoa.

+0

dễ hiểu – jianpx

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