2011-09-25 111 views
50

我有一個必須是唯一的A-Z,0-9和_檢查的NSString包含字母數字+下劃線只

如何檢查,如果輸入的是無效的字符串?我試過,但它接受信像A,A,O,O-等

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

回答

126

您可以創建自己的字符集:

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

一旦你的,你把它顛倒的一切,這不是在原始字符串:

s = [s invertedSet]; 

然後你可以使用一個字符串方法來查找您的字符串是否包含任何倒置集合:

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

但是,如果用戶希望在一個相當於加什麼Z用另一種語言如中文? – Supertecnoboff

+0

@Supertecnoboff中文沒有字母。也許你對日本的平假名和片假名感到困惑。或者你的意思是整個CJK統一表意文字,那就是80,388個:https://en.wikipedia.org/wiki/CJK_Unified_Ideographs –

+0

@Cœur我的觀點是,你如何確保這個檢查用戶輸入的數字只在ANY語言。這只是用英語來檢查它。 – Supertecnoboff

3

你可以通過字符串中的每個字符循環,並檢查它的字母數字:

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

創建你自己的字符集使用[NSCharacterSet characterSetWithCharactersInString:],然後像你一樣修剪,看看返回的字符串是否有長度值。

或者你可以使用invertedSet刪除所有非設置字符,如果這將有助於產生一個清理過的字符串。

35

您可以使用pred icate:

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

編輯: 您正在使用[NSString stringWithString:nameField.text]我沒有注意到。

改爲使用nameField.text

+0

謝謝。它爲我工作 – Sakthimuthiah

+0

@Sinetris在myRegex末尾*做什麼?這就像一個冠軍!謝謝。 – Scooter

-1

這是一個快速的助手,如果它有助於

-(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

此算法僅適用於包含單個大寫字符的字符串。 – Pol

8

一些更簡單的方法,

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

它會與_underscore性結合起來的字母數字。

你可以用它喜歡,

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

PS。例如,從@DaveDeLong例如:)

+0

這個問題明確給出了'alphanumericCharacterSet'的例子,因爲它接受å,ä,ö,ø等不是所需的解決方案。 –

+2

這個答案現在很甜,現在我有糖尿病。 – GeneCode

1

複製在這裏是你如何能做到這一點在斯威夫特(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 
    } 
} 
相關問題