Alguém sabe como validar um endereço de email no Swift? Encontrei este código:
- (BOOL) validEmail:(NSString*) emailString {
if([emailString length]==0){
return NO;
}
NSString *regExPattern = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
NSRegularExpression *regEx = [[NSRegularExpression alloc] initWithPattern:regExPattern options:NSRegularExpressionCaseInsensitive error:nil];
NSUInteger regExMatches = [regEx numberOfMatchesInString:emailString options:0 range:NSMakeRange(0, [emailString length])];
NSLog(@"%i", regExMatches);
if (regExMatches == 0) {
return NO;
} else {
return YES;
}
}
mas não posso traduzi-lo para Swift.
ios
validation
email
swift
Giorgio Nocera
fonte
fonte
.coffee
Respostas:
Eu usaria
NSPredicate
:para versões do Swift anteriores à 3.0:
para versões do Swift anteriores à 1.2:
fonte
return emailTest.evaluateWithObject(testStr)
seria muito mais simples e legível? Comparando com== true
é um pouco como Javascript.Edição, atualizada para o Swift 3:
Resposta original para Swift 2:
Está funcionando bem.
fonte
Como uma
String
extensão de classeSWIFT 4
Uso
fonte
countElements
é agoracount
Se você está procurando uma solução limpa e simples para fazer isso, consulte https://github.com/nsagora/validation-components .
Ele contém um predicado de validação de email que é fácil de integrar no seu código:
Por trás do capô, ele usa o RFC 5322 reg ex ( http://emailregex.com ):
fonte
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)
É 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: [email protected])
__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 [email protected]) 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.
fonte
Aqui está um fusível das duas respostas mais votadas com o regex correto: uma extensão String usando predicado para que você possa chamar string.isEmail
fonte
Maneira mais simples no Swift 5
Exemplo
retorna ...
fonte
Eu sugeriria usá-lo como uma extensão de String:
E para usá-lo:
fonte
Esta é a versão atualizada do Swift 2.0 - 2.2
fonte
Há muitas respostas corretas aqui, mas muitas das "expressões regulares" estão incompletas e pode acontecer que um email como: "name @ domain" resulte em um email válido, mas não é. Aqui a solução completa:
fonte
Aqui está um método baseado em
rangeOfString
:Nota: tamanho atualizado do TLD.
Aqui está o RegEx definitivo para email, de acordo com a RFC 5322, observe que isso não é melhor usado porque verifica apenas a sintaxe básica dos endereços de email e não verifica se o domínio de nível superior existe.
Consulte Regular-Expressions.info para obter informações mais completas sobre o RegExs por email.
Observe que não há escape conforme exigido por um idioma como Objective-C ou Swift.
fonte
.engineer
existem.Eu prefiro usar uma extensão para isso. Além disso, este URL http://emailregex.com pode ajudá-lo a testar se o regex está correto. De fato, o site oferece implementações diferentes para algumas linguagens de programação. Compartilho minha implementação do Swift 3 .
fonte
Para swift 2.1: isso funciona corretamente com o email foo @ bar
fonte
Uso do Swift 4.2
E usado
fonte
Esta é uma nova versão para "A SOLUÇÃO RAZOÁVEL" de @Fattie, testada no Swift 4.1 em um novo arquivo chamado
String+Email.swift
:Portanto, seu uso é simples:
Simplesmente não gosto de adicionar
func
a aosString
objetos, pois ser um endereço de email é inerente a eles (ou não). Portanto, umaBool
propriedade se encaixaria melhor que afunc
, pelo que entendi.fonte
Crie uma extensão simples:
Exemplo:
Você pode estender seguinte extensão a qualquer coisa que você precisa:
isValidPhoneNumber
,isValidPassword
etc ...fonte
NSRange
propriedade length deve ser usada emString
utf16.count
vez decharacters.count
No Swift 4.2 e no Xcode 10.1
Se você deseja usar o SharedClass.
E chamar função assim ....
fonte
Eu criei uma biblioteca projetada para validações de entrada e um dos "módulos" permite validar facilmente um monte de coisas ...
Por exemplo, para validar um email:
SwiftCop é a biblioteca ... espero que ajude!
fonte
Aqui está uma extensão no Swift 3
Apenas use-o assim:
fonte
Como existem tantos nomes de domínio de nível superior estranhos agora, paro de verificar o tamanho do domínio de topo ...
Aqui está o que eu uso:
fonte
Parece funcionar também ...
fonte
Resposta atualizada @Arsonik answer to Swift 2.2, usando código menos detalhado do que outras soluções oferecidas:
fonte
A resposta de @ JeffersonBe é próxima, mas retorna
true
se a string for "algo que contém algué[email protected] um e-mail válido", que não é o que queremos. A seguir, há uma extensão no String que funciona bem (e permite testar o número de telefone válido e outros detectores de dados para inicializar.fonte
E para o Swift 3 :
fonte
Minha única adição à lista de respostas seria que, para Linux,
NSRegularExpression
não existe, é realmenteRegularExpression
Isso compila com sucesso no macOS e no Ubuntu.
fonte
Melhor solução com melhor resultado para
fonte
Eu gosto de criar extensão
uso:
fonte
Swift 5
Então:
fonte
Regex perfeito como o Google Email
fonte
Ou você pode ter uma extensão para o texto opcional do UITextField:
Como usar:
extensão:
fonte