2014-11-25 101 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(見例子)。幸運的是,我們不必在意這一點,因爲您在正則表達式中不使用\

不應該直接在格式字符串中指定正則表達式(就像在之前的版本中一樣),因爲它會導致格式字符串語法的另一級轉義。