2010-08-21 136 views
7

我正在尋找檢查NSString包含數字和字母字符的最佳方法。 我到目前爲止所提供的是下面的代碼,但這只是告訴我,沒有輸入任何不是數字或字母的字符。檢查NSString包含字母和數字

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

我知道說這是異端,但最簡單,最容易理解,最有效的方法就是循環訪問字符串,用'characterAtIndex'提取每個字符,並根據適當的邊界對其進行測試。與其他人一樣,如果你想從現在開始的6個月內瞭解代碼,最好有一些非常好的評論。 – 2013-05-13 15:16:00

回答

14

只是修剪letterCharacterSet和decimalDigitCharacterSet並檢查是否產生字符串不等於原始字符串:

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

謝謝你。是的,這是我最終做的。 – ADude 2010-08-23 11:22:49

+0

多麼酷的東西! – jianpx 2013-11-11 08:37:40

+0

檢測錯誤:如果字符串包含控制字符,則返回YES,這是錯誤的。 – jianpx 2013-11-11 08:45:21

5

kovpas的回答工作正常,如果你在開始或者在信末和數字另一端。如果數字嵌入字母之間,反之亦然,例如'abc123abc',則會出現問題。這裏是一個解決方案:

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

這個答案效果更好!我不知道你爲什麼使用'invertedSet'。謝謝 – Ezeki 2013-05-08 19:57:45

+0

這個問題的訣竅在於檢查肯定是比較複雜的。第一次檢查建立一個沒有數字的字符串;如果字符串與原始字符相同,則字符串中沒有數字。第二次檢查信件也會進行類似的檢查。這就是爲什麼這兩種情況都沒有。 – Amory 2013-05-13 01:48:23

+0

是的,但你不需要使用'invertedSet',即使沒有它也可以很好地工作 – Ezeki 2013-05-13 13:42:10

4

我不知道前兩個答案覆蓋的要求,所以這是對應於要求的更嚴格的解釋回答。

以從原崗位的代碼中的註釋要求:

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

這意味着,一個字符串,通過測試只能包含數字和字母,每一個的至少一個。

NSStringrangeOfCharacterFromSet:在字符串中找到一個字符,如果它屬於某個集合,那麼我們可以使用該字符。

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 
} 

如在文檔詳述,rangeOfCharacterFromSet:返回{NSNotFound,0}的情況下,沒有從所述設定的字符在字符串中發現的NSRange。這與在Cocoa中搜索字符串或字符的其他方法類似。

+0

容易理解 – jianpx 2013-11-11 08:37:16

相關問題