我正在尝试使用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
}
答案 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 :(得分:1)
如果你只是想检查以空格分隔的前后名字,我会试试这个:
- (BOOL)validName:(NSString*)name
{
NSArray *components = [name componentsSeparatedByString:@" "];
return ([components count] >= 1);
}
这将检查您是否至少有两个由空格分隔的组件。这也适用于具有3个或更多组件(中间名)的名称。