2011-09-25 40 views
50

Tôi có chuỗi chỉ cần a-z, 0-9 và _Kiểm tra xem NSString có chứa ký tự chữ và số + dấu gạch dưới chỉ

Làm cách nào để kiểm tra xem đầu vào có hợp lệ không? Tôi đã thử điều này, nhưng nó chấp nhận thư như å, ä, ö, ø, vv

NSString *string = [NSString stringWithString:nameField.text]; 
NSCharacterSet *alphaSet = [NSCharacterSet alphanumericCharacterSet]; 
[string stringByTrimmingCharactersInSet:alphaSet]; 
[string stringByReplacingOccurrencesOfString:@"_" withString:@""]; 
BOOL valid = [[string stringByTrimmingCharactersInSet:alphaSet] isEqualToString:@""]; 

Trả lời

126

Bạn có thể tạo bộ ký tự của riêng bạn:

NSCharacterSet *s = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"]; 

Một khi bạn có đó, bạn nghịch nó đến tất cả những gì không có trong chuỗi ban đầu của bạn:

s = [s invertedSet]; 

Và sau đó bạn có thể sử dụng một chuỗi để tìm xem chuỗi của bạn có chứa bất kỳ thứ gì trong bộ đảo ngược không:

NSRange r = [string rangeOfCharacterFromSet:s]; 
if (r.location != NSNotFound) { 
    NSLog(@"the string contains illegal characters"); 
} 
+0

Nhưng nếu người dùng muốn thêm vào tương đương với A đến Z bằng ngôn ngữ khác như tiếng Trung? – Supertecnoboff

+0

@Supertecnoboff không có bảng chữ cái bằng tiếng Trung. Có lẽ bạn đang bối rối với Hiragana và Katakana của Nhật Bản. Hoặc bạn có nghĩa là toàn bộ IQograph của CJK, và đó là 80,388 trong số chúng: https://en.wikipedia.org/wiki/CJK_Unified_Ideographs –

+0

@ Theo quan điểm của tôi là, làm cách nào bạn có thể đảm bảo rằng điều này kiểm tra người dùng đã nhập số chỉ trong BẤT KY ngôn ngữ. Điều này chỉ kiểm tra nó bằng tiếng Anh. – Supertecnoboff

3

Bạn lặp qua mỗi nhân vật trong chuỗi và có thể kiểm tra xem nó là chữ và số:

BOOL isMatch = YES; 
for (int i = 0; i < [string length]; i++) { 
    unichar c = [string characterAtIndex:i]; 
    if (!isalnum(c) && c != '_') { 
     isMatch = NO; 
     break; 
    } 
} 
if (isMatch) { 
    // valid 
} else { 
    // invalid 
} 
4

Tạo tập hợp ký tự của riêng bạn bằng cách sử dụng [NSCharacterSet characterSetWithCharactersInString:], sau đó cắt như bạn đang làm để xem chuỗi trả về có giá trị độ dài hay không.

Hoặc bạn có thể sử dụng invertedSet để xóa tất cả các ký tự không được đặt, nếu điều đó sẽ giúp tạo ra chuỗi được làm sạch.

35

Bạn có thể sử dụng icate:

NSString *myRegex = @"[A-Z0-9a-z_]*"; 
NSPredicate *myTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", myRegex]; 
NSString *string = nameField.text; 
BOOL valid = [myTest evaluateWithObject:string]; 

Edit: Tôi không nhận thấy rằng bạn đang sử dụng [NSString stringWithString:nameField.text].

Sử dụng nameField.text để thay thế.

+0

Cảm ơn. Nó làm việc cho tôi – Sakthimuthiah

+0

@Sinetris * ở cuối myRegex làm gì? Điều này hoạt động như một nhà vô địch! Cảm ơn. – Scooter

-1

đây là một helper nhanh chóng nếu nó giúp

-(BOOL)isString:(NSString *)s{ 
    char letter = 'A'; 
    //BOOL isLetter=NO; 
    for (int i=0; i<26; i++) { 
     NSString *temp = [NSString stringWithFormat:@"%c",letter+i]; 
     if ([s isEqualToString:temp]) { 
      return YES; 
     } 
    } 
    return NO; 
} 
+0

Thuật toán này chỉ hoạt động cho các chuỗi chứa ký tự chữ hoa đơn. – Pol

8

Một số cách dễ dàng hơn,

NSMutableCharacterSet *allowedSet = [NSMutableCharacterSet characterSetWithCharactersInString:@"_"]; 
[allowedSet formUnionWithCharacterSet:[NSCharacterSet alphanumericCharacterSet]]; 
NSCharacterSet *forbiddenSet = [allowedSet invertedSet]; 

Nó sẽ kết hợp chữ và số cùng với _underscore.

bạn có thể sử dụng nó như thế,

NSRange r = [string rangeOfCharacterFromSet:forbiddenSet]; 
if (r.location != NSNotFound) { 
    NSLog(@"the string contains illegal characters"); 
} 

PS. Ví dụ copy từ @DaveDeLong dụ :)

+0

Câu hỏi đặc biệt đưa ra ví dụ về 'chữ và sốCharacterSet' không phải là giải pháp mong muốn vì nó chấp nhận å, ä, ö, ø, v.v. –

+2

Câu trả lời này ngọt ngào đến mức bây giờ tôi bị tiểu đường. – GeneCode

1

Đây là cách bạn có thể làm điều đó trong Swift (như là một phần mở rộng của lớp String):

extension String { 

    func containsValidCharacters() -> Bool { 

     var charSet = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_") 
     charSet = charSet.invertedSet 

     let range = (self as NSString).rangeOfCharacterFromSet(charSet) 

     if range.location != NSNotFound { 
      return false 
     } 

     return true 
    } 
} 
Các vấn đề liên quan