누구나 Swift에서 전자 메일 주소의 유효성을 검사하는 방법을 알고 있습니까? 이 코드를 찾았습니다.
- (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;
}
}
그러나 나는 그것을 스위프트로 번역 할 수 없습니다.
답변
나는 사용할 것이다 NSPredicate
:
func isValidEmail(_ email: String) -> Bool {
let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
let emailPred = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
return emailPred.evaluate(with: email)
}
3.0 이전의 Swift 버전 :
func isValidEmail(email: String) -> Bool {
let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
let emailPred = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
return emailPred.evaluate(with: email)
}
1.2 이전의 Swift 버전 :
func isValidEmail(email: String) -> Bool {
let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
if let emailPred = NSPredicate(format:"SELF MATCHES %@", emailRegEx) {
return emailPred.evaluateWithObject(email)
}
return false
}
답변
편집, Swift 3 용으로 업데이트되었습니다 :
func validateEmail(enteredEmail:String) -> Bool {
let emailFormat = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
let emailPredicate = NSPredicate(format:"SELF MATCHES %@", emailFormat)
return emailPredicate.evaluate(with: enteredEmail)
}
Swift 2에 대한 원래 답변 :
func validateEmail(enteredEmail:String) -> Bool {
let emailFormat = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
let emailPredicate = NSPredicate(format:"SELF MATCHES %@", emailFormat)
return emailPredicate.evaluateWithObject(enteredEmail)
}
잘 작동합니다.
답변
A와 String
클래스 확장
스위프트 4
extension String {
func isValidEmail() -> Bool {
// here, `try!` will always succeed because the pattern is valid
let regex = try! NSRegularExpression(pattern: "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$", options: .caseInsensitive)
return regex.firstMatch(in: self, options: [], range: NSRange(location: 0, length: count)) != nil
}
}
용법
if "rdfsdsfsdfsd".isValidEmail() {
}
답변
이를 위해 깨끗하고 간단한 솔루션을 찾고 있다면 https://github.com/nsagora/validation-components를 살펴보십시오. .
코드에 쉽게 통합 할 수있는 이메일 유효성 검사 조건자가 포함되어 있습니다.
let email = "test@example.com"
let rule = EmailValidationPredicate()
let isValidEmail = rule.evaluate(with: email)
후드 뒤에는 RFC 5322 reg ex ( http://emailregex.com )가 사용됩니다.
let regex = "(?:[\\p{L}0-9!#$%\\&'*+/=?\\^_`{|}~-]+(?:\\.[\\p{L}0-9!#$%\\&'*+/=?\\^_`{|}" +
"~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\" +
"x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[\\p{L}0-9](?:[a-" +
"z0-9-]*[\\p{L}0-9])?\\.)+[\\p{L}0-9](?:[\\p{L}0-9-]*[\\p{L}0-9])?|\\[(?:(?:25[0-5" +
"]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-" +
"9][0-9]?|[\\p{L}0-9-]*[\\p{L}0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21" +
"-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"
답변
합리적인 해결책은 다음과 같습니다.
“합리적인 솔루션”
많은 대용량 앱에서 수년 동안 사용 및 테스트되었습니다.
1- 이 제안에서 자주 볼 수있는 많은 끔찍한 정규식 실수 를 피합니다.
2-그렇지 않습니다 특정 RFC에서 유효하다고 생각되지만 완전히 어리 석고 이메일로 사용할 수 없으며 지원 담당자가 즉시 거부 할 수있는 “x @ x”와 같은 어리석은 이메일 허용 메일러 서비스 (mailchimp, google, aws 등)는 단순히 거부합니다. 어떤 이유로 ‘x @ x’와 같은 문자열을 허용하는 솔루션이 필요한 경우 다른 솔루션을 사용하십시오.
3-코드는 매우 이해하기 쉽다
4-KISS이며 신뢰할 수 있으며 수많은 사용자가있는 상업용 앱에서 테스트를 거쳤습니다.
5-기술 요점, 술어 는 Apple이 말한 것처럼 전제 조건 입니다 (이것이없는 코드 제안을 조심하십시오)
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()
}
}
그렇게 쉽습니다.
설명:
이하의 설명에서, “OC”는 문자 또는 숫자와 같은 일반적인 문자를 의미한다.
__firstpart …는 OC 로 시작하고 끝나야 합니다. 중간에 있는 문자의 경우 밑줄과 같은 특정 문자 를 사용할 수 있지만 시작과 끝 은 OC 여야합니다. (단, 하나의 OC 만 있으면 괜찮 습니다 (예 : j@blah.com)).
__serverpart … “blah”와 같은 섹션 이 있습니다 . 이는 반복합니다 . (따라서 mail.city.fcu.edu 유형의 것입니다.) 섹션은 OC 로 시작하고 끝나야 하지만 가운데 에는 대시 “-” 가있을 수도 있습니다 . (허용하려는 경우 다른 거기에 이상한 문자, 아마 밑줄을 단순히 대시 전에 추가합니다.) 그것은의 확인을 그냥 섹션 가지고 하나의 OC를. (joe@w.campus.edu에서와 같이) 최대 5 개의 섹션을 가질 수 있으며 하나 를 가져야합니다. 마지막으로 TLD (예 : .com)의 크기 는 엄격하게 2-8입니다.. 지원 부서에서 선호하는대로 “8”만 변경하십시오.
중요!
술어를 전역으로 유지해야하며 매번 작성하지 마십시오.
이것이 문서 의 전체 문제 에 대해 Apple이 언급 한 첫 번째 사항 입니다.
술어를 캐시하지 않는 제안을 볼 때 매우 놀랍습니다.
답변
올바른 정규 표현식을 사용하여 가장 많이 투표 된 두 가지 답변의 퓨즈는 다음과 같습니다.
extension String {
var isEmail: Bool {
let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,20}"
let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
return emailTest.evaluateWithObject(self)
}
}
답변
Swift 5에서 가장 간단한 방법
extension String {
var isValidEmail: Bool {
NSPredicate(format: "SELF MATCHES %@", "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}").evaluate(with: self)
}
}
예
"kenmueller0@gmail.com".isValidEmail
보고…
true