2009-02-04 96 views
0

以下代碼有什麼問題?objective-c:確定正則表達式是否匹配字符串

-(IBAction)numFieldDoneEditing{ 
     NSPredicate * regexTest = [NSPredicate predicateWithFormat: @"SELF MATCHES '^\\d*\\.\\d{2}$'"]; 
     NSString *text = [[NSString alloc] initWithFormat: @"%@", numberField.text]; 
     if ([regexTest evaluateWithObject: text] == YES) { 
       //do something 
     } 
     else{ 
       //do something else 
     } 
     [text release]; 
     [regexTest release]; 
    } 

回答

3

出於某種原因,你要逃避你反斜線兩次\d序列中的正則表達式規範:

NSPredicate * regexTest = [NSPredicate predicateWithFormat: @"SELF MATCHES '^\\\\d*\\.\\\\d{2}$'"]; 

其他一些問題與您的代碼:

  • 你不應該釋放regexText對象,因爲您不是所有者。它不是用名爲initcopy的方法創建的。查看Memory Management Programming Guide for Cocoa
  • 這更像是一個樣式問題,但是如果你有一個布爾變量,不要把它與YES或NO進行比較,它只會讓代碼更難理解。直接測試它或反轉。例如:

    // Positive test: 
    if([regexTest evaluateWithObject: text]) 
        ; // do stuff 
    
    // Negative test 
    if(![regexTest evaluateWithObject: text]) 
        ; // do stuff 
    
+0

關於布爾人:這不僅僅是一種風格的東西。不能保證BOOL只能設置爲YES或NO。由於BOOL與char相同,所以BOOL flag = 42是完全可能的。這是糟糕的風格,但它確實發生了,所以你的代碼不應該根據YES進行測試。 – Chuck 2009-02-04 22:26:59

3

既然你與iPhone,可可觸摸標記這一點,應該是值得一提的是NSPredicate不可用在iPhone上。它仍然可以在模擬器中工作,因爲它使用桌面框架,但它不能在iPhone上工作。