2012-07-12 44 views
0

我想用NSPredicate來評估一個NSString是否有名字和姓氏(本質上是兩個非數字字之間的空格)。此代碼一直沒有工作對我來說(代碼採取&從略作修改:What are best practices for validating email addresses in Objective-C for iOS 2.0?NSPredicate檢測名字和姓氏

-(BOOL) validName:(NSString*) nameString { 
    NSString *regExPattern = @"[A-Z]+_[A-Z]"; 
    NSRegularExpression *regEx = [[NSRegularExpression alloc] initWithPattern:regExPattern options:NSRegularExpressionCaseInsensitive error:nil]; 
    NSUInteger regExMatches = [regEx numberOfMatchesInString:nameString options:0 range:NSMakeRange(0, [nameString length])]; 


    if (regExMatches == 0) { 
     return NO; 
    } else 
     return YES; 
    } 
} 

我覺得有什麼不對我的正則表達式,但我不知道如何解決它這是我如何檢查字符串:

if([self validName:nameTextField.text]) { 
    // Valid Name 
} else { 
    // Name no valid 
} 

回答

1

首先,如果你想匹配一個空格,然後只是把空間的正則表達式,你現在有下劃線需要一個下劃線您的姓名字段以匹配。

二,NSPredicate將整個字符串與正則表達式匹配,因此該模式不會捕獲正常的姓氏(即具有多個字符),即使是空格也是如此。您需要添加一些涵蓋名稱最後部分的表達式。第三,由於您將文本字段直接傳遞到檢查中,因此您要對用戶施加一些壓力,以便按照預期輸入所有內容。在測試之前,您可能需要首先清理字符串。就個人而言,我會至少修剪空格的字符串,並用一個空格替換多個空格。

下面是一些代碼,這是否:

NSString *regExPattern = @"[A-Z]+ [A-Z]+"; //Added a "+" to match the whole string up to the end. 

檢查:

NSString *name = nameTextField.text; 


name = [name stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

name = [name stringByReplacingOccurrencesOfString:@" +" 
             withString:@" " 
              options:NSRegularExpressionSearch 
              range:NSMakeRange(0, name.length)]; 
if([self validName: name]) { 
    // Valid Name 
} else { 
    // Name no valid 
} 

正如你能想象有很多方法可以做到這一點,但是這是一個開始。你應該考慮你的測試「正確」的名字,不過,因爲有不會傳給你簡單的regex,用撇號和重音實例名稱很多名字,比如:

  1. 吉姆·奧馬利
  2. 措埃·瓊斯

+0

這就是我一直在尋找的,謝謝。我列出了將要輸入的可能名稱,但爲了防止列表發生變化,我如何添加對撇號和特殊字符的支持 – minichrispy 2012-07-12 17:30:32

1

如果你只是要檢查的空間分隔fore-和姓,我會嘗試這樣的:

- (BOOL)validName:(NSString*)name 
{ 
    NSArray *components = [name componentsSeparatedByString:@" "]; 
    return ([components count] >= 1);  
} 

這將檢查您是否至少有兩個由空格分隔的組件。這也適用於具有3個或更多組件(中間名稱)的名稱。