0

我正在尝试使用 NSPredicate 来评估 NSString 是否同时具有名字和姓氏(本质上是两个非数字单词之间的空格)。这段代码对我不起作用(代码取自并稍作修改:What are best practice for validateing 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
}
4

2 回答 2

1

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

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

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

于 2012-07-12T16:12:58.423 回答
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. 佐伊琼斯

等等

于 2012-07-12T15:40:41.077 回答