NSPredicate Detect First&姓

时间:2012-07-12 14:10:26

标签: objective-c nspredicate

我正在尝试使用NSPredicate来评估NSString是否同时具有名字和姓氏(基本上是两个非数字单词之间的空格)。此代码对我来说并不起作用(代码从What are best practices for validating email addresses in Objective-C for iOS 2.0?稍稍修改和修改:

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

我认为我的regEx模式有问题,但我不确定如何修复它。这是我检查字符串的方式:

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

2 个答案:

答案 0 :(得分: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
}

你可以想象有很多方法可以做到这一点,但这是一个开始。您应该考虑对“正确”名称进行测试,因为有许多名称不能通过简单的正则表达式,例如带有撇号和重音符号的名称,例如:

  1. Jim O'Malley
  2. ZoëJones

答案 1 :(得分:1)

如果你只是想检查以空格分隔的前后名字,我会试试这个:

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

这将检查您是否至少有两个由空格分隔的组件。这也适用于具有3个或更多组件(中间名)的名称。