无法进行正则表达式匹配
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#########..
在+
之前我需要放\
。那是我的错误。
您好,我需要 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#########..
在+
之前我需要放\
。那是我的错误。