2011-11-19 9 views
9

Desidero utilizzare la classe NSRegularExpression per convalidare se un NSString è un indirizzo e-mail.NSRegularExpression convalida e-mail

Qualcosa di simile a questo pseudocodice:

- (BOOL)validateMail : (NSString *)email 
{ 
    NSRegularExpression *expression = [NSRegularExpression regularExpressionWithPattern:@"" options:NSRegularExpressionCaseInsensitive error:NULL]; 

    if(emailValidated) 
    { 
     return YES; 
    }else{ 
     return NO; 
    } 
} 

Ma io non so come esattamente i convalidare un NSString se è alla ricerca come questo "[email protected]"

Forse qualcuno mi può aiutare Qui.

Saluti s4lfish

risposta

31

È possibile utilizzare:

@"^[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}$"; // Edited: added^and $ 

potete provarlo qui:

http://gskinner.com/RegExr/?2rhq7

E salvare questo link che vi aiuterà con Regex in futuro :

http://gskinner.com/RegExr/

EDIT

si può fare in questo modo:

NSString *string = @"[email protected]"; 
NSString *expression = @"^[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}$"; // Edited: added^and $ 
NSError *error = NULL; 

    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:expression options:NSRegularExpressionCaseInsensitive error:&error]; 

    NSTextCheckingResult *match = [regex firstMatchInString:string options:0 range:NSMakeRange(0, [string length])]; 

    if (match){ 
     NSLog(@"yes"); 
    }else{ 
     NSLog(@"no"); 
    } 
+2

wow che sembra in disordine –

+0

Grazie, ma il mio problema è che non trovo una funzione per dimostrare che l'e-mail inserita si adatta alla regex. Ho esaminato la documentazione di Apple, ma in qualche modo NSRegularExpression non ha una funzione che restituisce un valore booleano per la mia "if-statement". – s4lfish

+2

Ciao, ho aggiunto un esempio di codice per questo. E BTW @Alex Nichol sarà fantastico se tu possa spiegare il tuo commento. Potrei sbagliarmi nella mia risposta, ma la tua dose di commento non aiuta me o nessun altro a capire meglio questo problema. – shannoga

8

Questa era una domanda più vecchio, ma è abbastanza generale per andare mai fuori moda.

Il 99,9% delle regex dell'indirizzo di posta elettronica sono errate e ancor meno gestisce correttamente i domini internazionali (IDN).

Tentare di eseguire un'efficace regex di posta elettronica non è un buon utilizzo del tempo di sviluppo o dei cicli della CPU utente.

Questo è molto più semplice:

  1. Partita [^@][email protected]([^@]+)

  2. Estrae il dominio per la parte corrispondente.

  3. Errore se corrisponde a un dominio escluso. Memorizza in cache l'elenco dei domini bannati localmente da un endpoint JSON in modo da non dover attendere la riapprovazione e aggiornarlo al volo. (Assicurati di registrare le statistiche web per l'analisi di conversione.)

  4. Verificare che il dominio abbia record DNS. Controlla A e AAAA, oltre a MX, perché non tutti i domini implementano MX. (Lame ma vero)

  5. Basta provare a inviare l'e-mail già. L'utente proverà di nuovo se percepisce che un'app ha un valore. :))

+0

d'accordo, il dominio di primo livello può avere più di 4, come 'community',' properties'. troppo severo è peggio di niente. – chao787

0

Swift 4 versione

sto scrivendo questo per coloro che stanno facendo Swift 4 versione per la posta elettronica espressione regolare. Quanto sopra può essere fatto come segue:

do { 
     let emailRegex = try NSRegularExpression(pattern: "^[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}$", options: .caseInsensitive) 
     let textRange = NSRange(location: 0, length: email.count) 
     if emailRegex.firstMatch(in: email, options: [], range: textRange) != nil { 
      //Do completion code here 
     } else { 
      //Do invalidation behaviour 
     } 
    } catch { 
     //Do invalidation behaviour 
    } 

Supponendo di posta elettronica è una stringa veloce digitato.

Problemi correlati