【问题标题】:NSPredicate for phone numberNSPredicate 用于电话号码
【发布时间】:2013-05-02 12:48:16
【问题描述】:

我的电话号码格式是 (987) 786-5645。

- (BOOL)validatePhoneNumberWithString:(NSString*)phone
{
    NSString *pNRegex = @"[(0-9)]{3}+\\ +\\[0-9-]{3}+\\[0-9]{4}";
    NSPredicate *PNTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pNRegex];
    return [PNTest evaluateWithObject:phone];
}

我正在使用上面的代码。

对此的确切正则表达式规则应该是什么?我能够找出数字和括号。

我应该用什么来检测右括号后的空格?

【问题讨论】:

  • 它很适合我:\\([0-9]{3}\\)\\s[0-9]{3}-[0-9]{4}.
  • 或...如果您只想将空格设为可选:\\([0-9]{3}\\)\\s?[0-9]{3}-[0-9]{4}
  • 或者...如果您想允许多个空格:\([0-9]{3}\)(\s*)?[0-9]{3}-[0-9]{4}... 或者我应该创建并回答它们,不是吗?

标签: ios nspredicate


【解决方案1】:

用这个替换你的 pNRegex,

NSString *pNRegex = @"^(\\([0-9]{3}\\) |[0-9]{3}-)[0-9]{3}-[0-9]{4}$";

希望对你有帮助。

【讨论】:

    【解决方案2】:

    也许更好的解决方案是去掉电话号码的所有非数字字符进行验证,这样你就只剩下一串数字了。

    正则表达式很容易被破坏,除非您对其输入非常严格,而且由于世界各地的电话号码差异很大,这种方式将允许您支持任何电话号码,而无需创建非常复杂的正则表达式。

    您可以使用这样的简单方法:

    - (NSString *)sanitizePhoneNumberString:(NSString *)phoneNumber {
        NSCharacterSet *illegalCharacters = [NSCharacterSet characterSetWithCharactersInString:@" +()-"];
        return [[phoneNumber componentsSeparatedByCharactersInSet:illegalCharacters] componentsJoinedByString:@""];
    }
    

    所以不是+1 (555) 123-4567

    您只需比较 15551234567。如果您将其存储在数据库中,您可能希望控制格式以在 UI 上显示,并且整数比较比大型数据集的字符串比较更快,因此您可以将 [sanitizedPhoneNumber intValue]; 作为 @ 存储在数据库中987654326@

    另一种使用简单正则表达式仅允许数字 0-9 (source) 的方法:

    - (NSString *)sanitizePhoneNumberString:(NSString *)phoneNumber {
        return [phoneNumber stringByReplacingOccurrencesOfString:@"[^0-9]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [phoneNumber length])];
    }
    

    【讨论】:

      【解决方案3】:

      使用这个表达式,它对我有用

      NSString *pNRegex = @"\\([0-9]{3}\\) [0-9]{3}\\-[0-9]{4}";
      

      【讨论】:

        【解决方案4】:

        检查这个,它适用于您的格式,

        如果你想给出特殊的字符,比如空格,(,),那么在那个字符后面加上 //

            NSString *phone=@"(123)123-1234";
            NSString *pNRegex = @"\\([0-9]{3}\\)[0-9]{3}\\-[0-9]{4}";
            NSPredicate *PNTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pNRegex];
            BOOL check=[PNTest evaluateWithObject:phone ];
            NSLog(@"%i",check);
        

        O/P:-

        (123)123-1234  - check=1
        
        (123123-1234   - check=0
        
        (123) 123-1234 - check=0
        

        如果你想在结束括号后给空间使用这个,

        NSString *phone=@"(123) 123-1234";
            NSString *pNRegex = @"\\([0-9]{3}\\)\\ [0-9]{3}\\-[0-9]{4}";
            NSPredicate *PNTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pNRegex];
            BOOL check=[PNTest evaluateWithObject:phone ];
            NSLog(@"%i",check);
        

        O/P:-

        (123) 123-1234  - check=1
        
        (123123-1234   - check=0
        
        (123)123-1234 - check=0
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多