2009-02-04 8 views
0

Quel est le problème avec le code suivant?objective-c: déterminer si une regex correspond à une chaîne

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

Répondre

3

Pour une raison quelconque, vous devez échapper à vos antislashs deux fois pour la séquence \d dans la spécification regex:

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

D'autres problèmes avec votre code:

  • Vous ne devrait pas libérer l'objet regexText parce que vous n'êtes pas un propriétaire. Il n'a pas été créé avec une méthode nommée init ou copy. Voir le Memory Management Programming Guide for Cocoa
  • Ceci est plus un problème de style, mais si vous avez une variable booléenne, ne le comparez pas pour l'égalité avec OUI ou NON, cela rend le code plus difficile à comprendre. Testez-le ou son inverse directement. Par exemple:

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

A propos de BOOLs: C'est plus qu'un simple style. Il n'y a aucune garantie qu'un BOOL ne sera défini que sur OUI ou NON. Puisque BOOL est la même chose qu'un char, il est tout à fait possible de dire BOOL flag = 42. C'est un mauvais style, mais ça arrive, donc votre code ne devrait jamais tester YES. – Chuck

+2

Pouvons-nous remplacer "pour une raison quelconque ..." par une raison réelle? –

+0

Donc, 42 signifierait NON? – Ferruccio

3

Depuis vous avez marqué ce avec l'iPhone et touche de cacao, il devrait être intéressant de noter que NSPredicate n'est pas disponible sur l'iPhone. Il fonctionnera toujours dans le simulateur, car cela utilise les frameworks de bureau, mais cela ne marchera pas sur l'iPhone lui-même.

Questions connexes