¿Alguien sabe cómo validar una dirección de correo electrónico en Swift? Encontré 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;
}
}
pero no puedo traducirlo a Swift.
ios
validation
email
swift
Giorgio Nocera
fuente
fuente
.coffee
Respuestas:
Yo usaría
NSPredicate
:Para versiones de Swift anteriores a la 3.0:
Para versiones de Swift anteriores a 1.2:
fuente
return emailTest.evaluateWithObject(testStr)
sería mucho más simple y legible? Comparar== true
es un poco como Javascript.Edición, actualizada para Swift 3:
Respuesta original para Swift 2:
Funciona bien
fuente
Como una
String
extensión de claseSWIFT 4
Uso
fuente
countElements
es ahoracount
Si está buscando una solución limpia y simple para hacer esto, debe consultar https://github.com/nsagora/validation-components .
Contiene un predicado de validación de correo electrónico que es fácil de integrar en su código:
Detrás del capó utiliza el RFC 5322 reg ex ( http://emailregex.com ):
fuente
Aquí está la solución razonable:
"LA SOLUCIÓN RAZONABLE"
Usado y probado durante años en muchas aplicaciones de gran volumen.
1 - evita los muchos errores terribles de expresiones regulares que a menudo ves en estas sugerencias
2 - NO permite correos electrónicos estúpidos como "x @ x" que se consideran válidos bajo ciertos RFC, pero son completamente tontos, no pueden usarse como correos electrónicos, y que su personal de soporte rechazaría instantáneamente, y que todos los servicios de correo (mailchimp, google, aws, etc.) simplemente rechazan. Si (por alguna razón) necesita una solución que permita cadenas como 'x @ x', use otra solución.
3 - el código es muy, muy, muy comprensible
4: es KISS, confiable y probado hasta la destrucción en aplicaciones comerciales con un enorme número de usuarios
5 - un punto técnico, el predicado es global, como Apple dice que debería ser (cuidado con las sugerencias de código que no tienen esto)
Es fácil.
Explicación:
En la siguiente descripción, "OC" significa carácter ordinario: una letra o un dígito.
__primera parte ... tiene que comenzar y terminar con un OC. Para los caracteres en el medio , puede tener ciertos caracteres como el subrayado, pero el inicio y el final deben ser un OC. (Sin embargo, está bien tener solo un OC y eso es todo, por ejemplo: [email protected])
__serverpart ... Tienes secciones como "bla". que repiten . (Entonces, el tipo de cosas mail.city.fcu.edu.) Las secciones tienen que comenzar y terminar con un OC, pero en el medio también puede tener un guión "-". (Si desea permitir otros caracteres inusuales allí, quizás el guión bajo, simplemente agregue antes del guión). Está bien tener una sección que sea solo un OC. (Como en [email protected]) Puede tener hasta cinco secciones, debe tener una. Finalmente el TLD (como .com) tiene un tamaño estrictamente de 2 a 8 . Obviamente, simplemente cambie ese "8" según lo prefiera su departamento de soporte.
¡IMPORTANTE!
Debe mantener el predicado como global, no lo construya siempre.
Tenga en cuenta que esto es lo primero que Apple menciona sobre todo el problema en los documentos.
Es muy sorprendente cuando ve sugerencias que no almacenan en caché el predicado.
fuente
Aquí hay un fusible de las dos respuestas más votadas con la expresión regular correcta: una extensión de cadena que usa un predicado para que pueda llamar a string.isEmail
fuente
La forma más sencilla en Swift 5
Ejemplo
devoluciones...
fuente
Sugeriría usarlo como una extensión de String:
Y para usarlo:
fuente
Esta es la versión actualizada para Swift 2.0 - 2.2
fuente
Aquí hay muchas respuestas correctas, pero muchas de las "expresiones regulares" están incompletas y puede suceder que un correo electrónico como: "nombre @ dominio" dé como resultado un correo electrónico válido, pero no lo es. Aquí la solución completa:
fuente
Aquí hay un método basado en
rangeOfString
:Nota: longitud de TLD actualizada.
Aquí está el RegEx definitivo para el correo electrónico según RFC 5322, tenga en cuenta que es mejor no usarlo porque solo verifica la sintaxis básica de las direcciones de correo electrónico y no verifica si el dominio de nivel superior existe.
Consulte Regular-Expressions.info para obtener información más completa sobre RegExs por correo electrónico.
Tenga en cuenta que no debe escapar según lo requiera un lenguaje como Objective-C o Swift.
fuente
.engineer
existen.Prefiero usar una extensión para eso. Además, esta url http://emailregex.com puede ayudarlo a probar si la expresión regular es correcta. De hecho, el sitio ofrece diferentes implementaciones para algunos lenguajes de programación. Comparto mi implementación para Swift 3 .
fuente
Para swift 2.1: esto funciona correctamente con el correo electrónico foo @ bar
fuente
Uso de Swift 4.2
Y usado
fuente
Esta es una nueva versión para "LA SOLUCIÓN RAZONABLE" de @Fattie, probada en Swift 4.1 en un nuevo archivo llamado
String+Email.swift
:Entonces su uso es simple:
Simplemente no me gusta agregar un
func
a losString
objetos, ya que ser una dirección de correo electrónico es inherente a ellos (o no). Por lo tanto, unaBool
propiedad encajaría mejor que unafunc
, según tengo entendido.fuente
Crear extensión simple:
Ejemplo:
Se puede extender siguiente extensión a todo lo que necesita:
isValidPhoneNumber
,isValidPassword
etc ...fuente
NSRange
propiedad de longitud debe usar enString
utf16.count
lugar decharacters.count
En Swift 4.2 y Xcode 10.1
Si quieres usar SharedClass.
Y llame a una función como esta ...
fuente
Hice una biblioteca diseñada para validaciones de entrada y uno de los "módulos" le permite validar fácilmente un montón de cosas ...
Por ejemplo para validar un correo electrónico:
SwiftCop es la biblioteca ... ¡espero que ayude!
fuente
Aquí hay una extensión en Swift 3
Solo úsalo así:
fuente
Dado que ahora hay tantos nombres de dominio de nivel superior extraños, dejo de verificar la longitud del dominio superior ...
Esto es lo que uso:
fuente
Parece funcionar también ...
fuente
Respuesta actualizada @Arsonik respuesta a Swift 2.2, usando menos código detallado que otras soluciones ofrecidas:
fuente
La respuesta de @ JeffersonBe es cercana, pero devuelve
true
si la cadena es "algo que contiene [email protected] un correo electrónico válido", que no es lo que queremos. La siguiente es una extensión en String que funciona bien (y permite probar el número de teléfono válido y otros detectores de datos para arrancar).fuente
Y para Swift 3 :
fuente
Mi única adición a la lista de respuestas sería que para Linux,
NSRegularExpression
no existe, en realidad esRegularExpression
Esto se compila con éxito tanto en macOS como en Ubuntu.
fuente
La mejor solución con el mejor resultado para
fuente
Me gusta crear extensión
uso:
fuente
Swift 5
Entonces:
fuente
Regex perfecto como Google Email
fuente
O puede tener una extensión para el texto opcional de UITextField:
cómo utilizar:
extensión:
fuente