无法进行正则表达式匹配

时间:2015-10-05 09:32:23

标签: ios objective-c regex nsregularexpression

您好,我需要法国的电话号码验证。

有效格式:+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))'

帮我解决这个问题。

3 个答案:

答案 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];