无法进行正则表达式匹配

Can't do regex matching

您好,我需要 phone 法国号码验证。

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

帮我解决这个问题。

NSString *phoneNumber = ...;

NSString *phoneRegex = @"^((\+)|(00))[0-9]{6,14}$";

NSPredicate *test = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", phoneRegex]; 
BOOL matches = [test evaluateWithObject:phoneNumber];

\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];
}

这将匹配作为有效 phone 数字开头的任何字符串。

[[NSPredicate predicateWithFormat:@"SELF MATCHES %@", @"\+2?6?2?\d?\d?\d?\d?\d?\d?\d?\d?\d?"] evaluateWithObject:phoneNumber];

电话号码将为 +2、+26、+262、...... +262#########..

+之前我需要放\。那是我的错误。