【问题标题】:NSPredicate Detect First & Last NameNSPredicate 检测名字和姓氏
【发布时间】:2012-07-12 14:10:25
【问题描述】:

我正在尝试使用 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
}

【问题讨论】:

    标签: objective-c nspredicate


    【解决方案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. 吉姆·奥马利
    2. 佐伊·琼斯

    等等

    【讨论】:

    • 这就是我要找的,谢谢。我有一个将要输入的可能名称的列表,但以防万一列表发生变化,我该如何添加对撇号和特殊字符的支持
    【解决方案2】:

    如果您只想检查以空格分隔的名字和姓氏,我会试试这个:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多