您好,我需要法国的电话号码验证。
有效格式:+262#########
在textDidChang中完成验证:所以我需要检查每个号码都属于上面的号码。
我的正则表达式
[[NSPredicate predicateWithFormat:@"SELF MATCHES %@", @"+2?6?2?\d?\d?\d?\d?\d?\d?\d?\d?\d?"] evaluateWithObject:@"+262989878989"]
执行此行应用程序崩溃时
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can't do regex matching, reason: (Can't open pattern U_REGEX_RULE_SYNTAX (string 2, pattern +2?6?2?\d?\d?\d?\d?\d?\d?\d?\d?\d?, case 0, canon 0))'
帮我解决这个问题。
答案 0 :(得分:2)
\d
无效,因为它位于字符串文字中,您必须转义\
(例如@"\\d"
)。您还应该转义+
因为它在正则表达式中具有特殊含义(例如@"^\\+262\\d{9}$"
)。
注意匹配字符串开头和结尾的^
和$
,如果这就是你的意思。或者如果你在较大的字符串中的任何地方寻找它,你应该检查字边界。如果没有这两种方法中的一种,那么+262
跟随超过九个字符就会出现误报。
-
如果您要确保有人输入与此格式匹配的数字,您可以执行以下操作:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSString *result = [textField.text stringByReplacingCharactersInRange:range withString:string];
return [[NSPredicate predicateWithFormat:@"SELF MATCHES %@", @"^(\\+(2(6(2\\d{0,9})?)?)?)?$"] evaluateWithObject:result];
}
这将匹配任何有效电话号码开头的字符串。
答案 1 :(得分:1)
[[NSPredicate predicateWithFormat:@"SELF MATCHES %@", @"\\+2?6?2?\\d?\\d?\\d?\\d?\\d?\\d?\\d?\\d?\\d?"] evaluateWithObject:phoneNumber];
phoneNumber将为+ 2,+ 26,+ 262,....... +262 ######### ..
在+
之前我需要放\\
。这是我的错误。
答案 2 :(得分:0)
NSString *phoneNumber = ...;
NSString *phoneRegex = @"^((\\+)|(00))[0-9]{6,14}$";
NSPredicate *test = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", phoneRegex];
BOOL matches = [test evaluateWithObject:phoneNumber];