Aqui está a solução razoável:
"A SOLUÇÃO RAZOÁVEL"
Usado e testado por anos em muitos aplicativos de grande volume.
1 - evita os muitos erros terríveis de regex que você costuma ver nessas sugestões
2 - NÃO permite e-mails estúpidos como "x @ x" que são considerados válidos sob certas RFCs, mas são completamente bobos, não podem ser usados como e-mails e que sua equipe de suporte rejeitaria instantaneamente e que todos serviços de mala direta (mailchimp, google, aws, etc) simplesmente rejeitam. Se (por algum motivo) você precisar de uma solução que permita seqüências de caracteres como 'x @ x', use outra solução.
3 - o código é muito, muito, muito compreensível
4 - é KISS, confiável e testado para destruição em aplicativos comerciais com um grande número de usuários
5 - um ponto técnico, o predicado é global, como a Apple diz que deveria ser (cuidado com as sugestões de código que não possuem isso)
let __firstpart = "[A-Z0-9a-z]([A-Z0-9a-z._%+-]{0,30}[A-Z0-9a-z])?"
let __serverpart = "([A-Z0-9a-z]([A-Z0-9a-z-]{0,30}[A-Z0-9a-z])?\\.){1,5}"
let __emailRegex = __firstpart + "@" + __serverpart + "[A-Za-z]{2,8}"
let __emailPredicate = NSPredicate(format: "SELF MATCHES %@", __emailRegex)
extension String {
func isEmail() -> Bool {
return __emailPredicate.evaluate(with: self)
}
}
extension UITextField {
func isEmail() -> Bool {
return self.text!.isEmail()
}
}
É tão fácil.
Explicação:
Na descrição a seguir, "OC" significa caractere comum - uma letra ou um dígito.
__primeira parte ... tem que começar e terminar com um OC. Para os caracteres no meio, você pode ter certos caracteres, como sublinhado, mas o início e o fim precisam ser um OC. (No entanto, é ok para ter apenas um OC e é isso, por exemplo: j@blah.com)
__serverpart ... Você tem seções como "blá". que se repetem . (Portanto, o tipo mail.city.fcu.edu.) As seções precisam começar e terminar com um OC, mas no meio você também pode ter um traço "-". (Se você quiser permitir outros caracteres incomuns, talvez o sublinhado, basta adicionar antes do traço.) Não há problema em ter uma seção que seja apenas um OC. (Como em joe@w.campus.edu) Você pode ter até cinco seções, precisa ter uma. Finalmente, o TLD (como .com) tem tamanho estritamente de 2 a 8. Obviamente, basta alterar esse "8" conforme preferir pelo seu departamento de suporte.
IMPORTANTE!
Você deve manter o predicado como global, não o construa sempre.
Observe que essa é a primeira coisa que a Apple menciona sobre todo o problema nos documentos.
É muito surpreendente quando você vê sugestões que não armazenam em cache o predicado.