2012-07-12 78 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个或更多组件(中间名称)的名称。