2014-11-25 57 views
0

我想验证一个字符串对下面的正则表达式:正则表达式与iOS

[(?=.*[A-Z])(?=.*[0-9])(?=.*[a-z]).{6,20}] 
  1. 验证通过,如果使用numberOfMatches方法如下进行:

    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@“[(?=.*[A-Z])(?=.*[0-9])(?=.*[a-z]).{6,20}]” options:0 error:&error]; 
    NSUInteger numberOfMatches = [regex numberOfMatchesInString:string options:0 range:NSMakeRange(0, string.length)]; 
    
    BOOL status numberOfMatches == string.length; 
    
  2. 如果使用NSPredicate进行验证,则验证失败:

    NSPredicate *test = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", [(?=.*[A-Z])(?=.*[0-9])(?=.*[a-z]).{6,20}]]; 
    BOOL status = [test evaluateWithObject:string]; 
    

这是什么原因?我想用NSPredicate来做到这一点。

+2

我不是一位ObjC专家,但这看起来不像我熟悉的任何语言的有效正则表达式。你打算如何匹配?具体来说,围绕整个事物的方括号可能不应该在那里。 – Amadan 2014-11-25 07:02:20

+0

你想验证一个字符串是否是字母数字?你想在哪里使用这个正则表达式? – 2014-11-25 07:05:41

+0

两次尝试都不正确。正则表达式应该是'^(?=。* [A-Z])(?=。* [0-9])(?=。* [a-z])。{6,20} $'。在第一种情况下,'numberOfMatches'应该对照1.在第二种情况下,你必须提供'@“'^(?=。* [AZ])(?=。* [0-9])(? =。* [az])。{6,20} $'“'作为参数。 – nhahtdh 2014-11-25 07:10:20

回答

1

[]围绕你的正则表达式是错误的,因为里面的所有内容都被解释为字符类的一部分。你的情况:

[(?=.*[A-Z])(?=.*[0-9])(?=.*[a-z]).{6,20}] 

为含有A-Z0-9a-z{}()?=.,*字符类。

由于NSRegularExpression正在使用ICU的正则表达式库,它支持字符类联合,就像在Java中一样。

正确的正则表达式应该是:

^(?=.*[A-Z])(?=.*[0-9])(?=.*[a-z]).{6,20}$ 

您与NSRegularExpression第一段代码应该是:

NSRegularExpression *regex = [NSRegularExpression 
           regularExpressionWithPattern: 
            @"^(?=.*[A-Z])(?=.*[0-9])(?=.*[a-z]).{6,20}$" 
           options:0 
           error:&error]; 
NSUInteger numberOfMatches = [regex numberOfMatchesInString:string 
            options:0 
            range:NSMakeRange(0, string.length)]; 

BOOL status = numberOfMatches == 1; 

由于正则表达式,只有当它的整个匹配字符串相匹配,你会得到最多1场比赛。

您与NSPredicate秒一段代码应该是:

NSPredicate *test = [NSPredicate predicateWithFormat: 
          @"SELF MATCHES %@", 
          @"'^(?=.*[A-Z])(?=.*[0-9])(?=.*[a-z]).{6,20}$'"]; 
BOOL status = [test evaluateWithObject:string]; 

注意,除了你必须为String对象字面做\转义,你需要take care of another level of escaping for the string literal in predicate syntax(见例子)。幸运的是,我们不必在意这一点,因为您在正则表达式中不使用\

不应该直接在格式字符串中指定正则表达式(就像在之前的版本中一样),因为它会导致格式字符串语法的另一级转义。