【问题标题】:Can't do regex matching无法进行正则表达式匹配
【发布时间】:2016-01-01 21:55:41
【问题描述】:

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

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

帮我解决这个问题。

【问题讨论】:

  • 法国电话号码的规则是什么?它们以 262 开头,后面有 9 位数字?一共12个?
  • @NSNoob: 是的,developer.apple.com/library/ios/documentation/Foundation/… 在这里我读到“\d”以获取数字为什么它不起作用..
  • 查看 Abhinav 的回答。它应该工作。只需添加 00 数字和 + 数字的验证规则
  • @TamilKing 我相信你的问题是另外一回事。您想要的是在输入的每个数字处验证用户电话号码输入。请查看我更新的帖子 - 虽然是非正则表达式!

标签: ios objective-c regex nsregularexpression


【解决方案1】:
[[NSPredicate predicateWithFormat:@"SELF MATCHES %@", @"\\+2?6?2?\\d?\\d?\\d?\\d?\\d?\\d?\\d?\\d?\\d?"] evaluateWithObject:phoneNumber];

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

+ 之前我需要输入\\。那是我的错。

【讨论】:

  • 这是不正确的。这也将匹配+6999999999+2999999999 甚至+999999999。另外,你想要\\d,而不是\d
【解决方案2】:

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

这将匹配任何作为有效电话号码开头的字符串。

【讨论】:

  • 谢谢..虽然我需要检查以正确数字开头的字符串,但您能帮我实现吗?
  • 我需要检查 textDidChange 中的类型:如果用户输入“+263”,我需要限制最后一个数字“3”..
  • @TamilKing - 好的,我现在知道了。你可以做类似@"^(\\+(2(6(2\\d{0,9})?)?)?)?$" 的事情。我知道这有点麻烦,但你不能只使用? 单个字符,而是从最后开始使用( )。假设您尝试在 UITextFieldDelegate 方法中执行此操作,请参阅修订后的答案。如果您在其他环境中使用它,您应该能够适应它。
  • @TamilKing 我可能会建议您考虑accepting 这些答案之一,或者发布您自己的答案并在您提出完全不同的答案时接受它。
  • 我发布了自己的答案。感谢您的回复。
【解决方案3】:
NSString *phoneNumber = ...;

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

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

【讨论】:

  • 这里看起来像是一些复制粘贴问题。我想在编辑我的帖子时,相同的代码会粘贴到您的帖子中。请您检查并恢复您原来的建议。对于给您带来的不便,我深表歉意。
猜你喜欢
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 2018-01-11
  • 2012-09-13
  • 1970-01-01
  • 2014-10-04
相关资源
最近更新 更多