2015-10-05 87 views
2

嗨我需要法国的电话号码验证。不能做正则表达式匹配

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

法国电话号码的规则是什么?他们从262开始,然后有9位数字?共有12个? – NSNoob

+0

@ NSNoob:是的,https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSRegularExpression_Class/这里我读了“\ d”获取数字为什么它不工作.. – TamilKing

+0

请参阅Abhinav的答案。它应该工作。只需添加00号码的验证规则以及+号码 – NSNoob

回答

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

phoneNumber的将是+2,+26,+262,....... +262 ######### ..

+之前,我需要把\\ 。这是我的错误。

+0

这是不正确的。这也将匹配'+ 6999999999'或'+ 2999999999'或甚至+ 999999999'。另外,你需要'\\ d',而不是'\ d'。 – Rob

+0

好吧,我会检查并更新我的答案 – TamilKing

0
NSString *phoneNumber = ...; 

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

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

它看起来像一些复制粘贴问题在这里。我想在编辑我的文章时,同样的代码会粘贴到你的文章中。你能否检查并恢复到你原来的建议。对于造成不便,我表示歉意。 – Abhinav

+0

好的。我可以编辑你的答案 –

1

\d不工作,因为它是在一个字符串,你必须逃脱\(例如@"\\d")。您也应该跳过+,因为它在正则表达式中也有特殊意义(例如@"^\\+262\\d{9}$")。

请注意^$匹配字符串的开头和结尾,如果这就是您的意思。或者,如果你在大字符串的任何地方查找,你应该检查字边界。如果没有这两种方法中的一种,则会因+262后跟9个以上字符而导致误报。

-

如果你想确保有人进入一个数字,这个格式相匹配,你可以这样做:

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

,将匹配任何字符串,它是年初一个有效的电话号码。

+0

谢谢..虽然类型我需要检查字符串以正确的数字开始,你能帮我实现这个目标吗? – TamilKing

+0

我需要检查,而在textDidChange类型:如果用户键入“+263”我需要限制最后一个数字“3”.. – TamilKing

+0

@TamilKing - 好的,我现在得到你。你可以做'@“^(\\ +(2(6(2 \\ d {0,9})?)?)?)?$”'。我知道这有点毛骨悚然,但你不能只是'?'这些单个字符,而是用'('')'来结尾。假设你试图在'UITextFieldDelegate'方法中做到这一点,请参阅修订后的答案。如果你在另一个环境中使用它,你应该可以适应它。 – Rob