이메일 주소를 신속하게 확인하는 방법은 무엇입니까?
스위프트에서 이메일 주소를 확인하는 방법을 아는 사람이 있습니까?다음 코드를 찾았습니다.
- (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;
}
}
스위프트로 번역할 수 없어요
다음을 사용합니다.
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)
}
Swift 3.0 이전 버전의 경우:
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)
}
Swift 1.2 이전 버전의 경우:
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
}
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() {
}
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)
}
잘 작동하고 있습니다.
이를 위한 깨끗하고 간단한 솔루션을 찾고 있다면 https://github.com/nsagora/validation-components 을 살펴봐야 합니다.
코드에 쉽게 통합할 수 있는 전자 메일 유효성 검사 술어가 포함되어 있습니다.
let email = "test@example.com"
let rule = EmailValidationPredicate()
let isValidEmail = rule.evaluate(with: email)
후드 뒤에는 RFC 5322 레덱스(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])+)\\])"
(서론.경우에 따라 iOS에 내장된 이 솔루션을 사용할 수 있습니다. https://multithreaded.stitchfix.com/blog/2016/11/02/email-validation-swift/ )
유일한 해결책:
1 - 예제 코드에서 자주 볼 수 있는 끔찍한 정규식 실수를 방지합니다.
2 - "x@x"와 같은 말도 안 되는 이메일을 허용하지 않습니다.
(어떤 이유로 'x@x'와 같은 넌센스 문자열을 허용하는 솔루션이 필요한 경우 다른 솔루션을 사용하십시오.)
3 - 코드는 매우 이해하기 쉽습니다.
4 - KISS, 신뢰할 수 있으며 엄청난 수의 사용자를 가진 상용 앱에서 파괴 테스트를 거쳤습니다.
5 - 술어는 애플이 말하는 것처럼 글로벌합니다.
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() ?? false
}
}
그 정도로 쉽습니다.
정규식에 처음 온 사람에 대한 설명:
이 설명에서 "OC"는 일반 문자(문자 또는 숫자)를 의미합니다.
__첫 부분...OC로 시작하고 끝나야 합니다.중간에 있는 문자의 경우 밑줄과 같은 특정 문자를 사용할 수 있지만 시작과 끝은 OC여야 합니다. (단, OC가 하나만 있어도 괜찮습니다. 예: j@blah.com)
__서버 파트...반복되는 "blah"와 같은 섹션이 있습니다(예: mail.city.fcu.edu ).섹션은 OC로 시작하고 끝나야 하지만 중간에 대시 "-"를 사용할 수도 있습니다.OC가 하나인 섹션은 괜찮습니다. (예: w.campus.edu ) 섹션은 최대 5개까지 가능합니다. 하나만 있어야 합니다.마지막으로 TLD(예: .com)의 크기는 엄격하게 2-8입니다(지원 부서에서 선호하는 대로 "8"만 변경하십시오).
중요한!
술어를 글로벌로 유지해야 하며, 매번 술어를 작성해서는 안 됩니다.
이것이 애플이 문서에서 전체 문제에 대해 언급한 첫 번째 사항입니다.
술어를 캐시하지 않는 제안은 시작하지 않습니다.
영어 이외의 문자
자연스럽게 영어 이외의 알파벳을 다룰 경우에는 적절하게 조정해야 합니다.
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
여기 올바른 정규식과 함께 가장 많이 투표된 두 개의 답변, 즉 string.isEmail을 호출할 수 있도록 술어를 사용하는 String 확장이 있습니다.
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)
}
}
String:의 확장자로 사용하는 것을 제안합니다.
extension String {
public var isEmail: Bool {
let dataDetector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)
let firstMatch = dataDetector?.firstMatch(in: self, options: NSRegularExpression.MatchingOptions.reportCompletion, range: NSRange(location: 0, length: length))
return (firstMatch?.range.location != NSNotFound && firstMatch?.url?.scheme == "mailto")
}
public var length: Int {
return self.characters.count
}
}
사용 방법:
if "hodor@gameofthrones.com".isEmail { // true
print("Hold the Door")
}
이것은 Swift 2.0 - 2.2의 업데이트된 버전입니다.
var isEmail: Bool {
do {
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.firstMatchInString(self, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, self.characters.count)) != nil
} catch {
return false
}
}
여기에는 많은 정답이 있지만 대부분의 "regex"가 불완전하고 "name@domain"과 같은 전자 메일이 유효한 전자 메일을 생성하지만 그렇지 않을 수 있습니다.여기에 완전한 솔루션이 있습니다.
extension String {
var isEmailValid: Bool {
do {
let regex = try NSRegularExpression(pattern: "(?:[a-z0-9!#$%\\&'*+/=?\\^_`{|}~-]+(?:\\.[a-z0-9!#$%\\&'*+/=?\\^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-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]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])", options: .CaseInsensitive)
return regex.firstMatchInString(self, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, self.characters.count)) != nil
} catch {
return false
}
}
}
다음은 다음을 기반으로 하는 방법입니다.rangeOfString
:
class func isValidEmail(testStr:String) -> Bool {
let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
let range = testStr.rangeOfString(emailRegEx, options:.RegularExpressionSearch)
return range != nil
}
참고: TLD 길이가 업데이트되었습니다.
다음은 RFC 5322에 따른 전자 메일에 대한 최종 ReGEx입니다. 전자 메일 주소의 기본 구문만 확인하고 최상위 도메인이 있는지는 확인하지 않으므로 사용하지 않는 것이 좋습니다.
(?:[a-z0-9!#$%&'*+/=?^_'{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*| "(?:[\x01-\x08\x0b\x0c-\x1f\x21\x23-\x5b-\x5d-\x7f]\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")(?:(?:[a-z0-9](?:[a-z0-9]*[a-z0-9]?\).+[a-z0-9](?:[a-z0-9-]*[a-z0-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]?|[a-z0-9-]*[a-z0-9]: (?:[\x01-\x08\x0b\x0c-\x1f\x21-\x5a\x53-\x7f]\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
이메일 ReGEx에 대한 자세한 내용은 Regular-Expressions.info 을 참조하십시오.
Objective-C 또는 Swift와 같은 언어에서 요구하는 이스케이프는 없습니다.
저는 그것을 위해 연장을 사용하는 것을 선호합니다.또한 이 URL http://emailregex.com 은 정규식이 올바른지 테스트하는 데 도움이 됩니다.실제로 이 사이트는 일부 프로그래밍 언어에 대해 다른 구현을 제공합니다.Swift 3에 대한 구현을 공유합니다.
extension String {
func validateEmail() -> Bool {
let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"
return NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluate(with: self)
}
}
이것은 스위프트 4.1에서 테스트된 @Fattie의 "합리적인 솔루션"의 새로운 버전입니다.String+Email.swift
:
import Foundation
extension String {
private static let __firstpart = "[A-Z0-9a-z]([A-Z0-9a-z._%+-]{0,30}[A-Z0-9a-z])?"
private static let __serverpart = "([A-Z0-9a-z]([A-Z0-9a-z-]{0,30}[A-Z0-9a-z])?\\.){1,5}"
private static let __emailRegex = __firstpart + "@" + __serverpart + "[A-Za-z]{2,6}"
public var isEmail: Bool {
let predicate = NSPredicate(format: "SELF MATCHES %@", type(of:self).__emailRegex)
return predicate.evaluate(with: self)
}
}
따라서 사용 방법은 간단합니다.
let str = "mail@domain.com"
if str.isEmail {
print("\(str) is a valid e-mail address")
} else {
print("\(str) is not a valid e-mail address")
}
저는 단순히 추가하는 것을 좋아하지 않습니다.func
에▁String
전자 메일 주소가 되는 개체는 개체에 고유합니다(또는 고유하지 않습니다).비상대기상태Bool
부동산은 a보다 더 잘 맞을 것입니다.func
내가 알기로는
swift 2.1의 경우: 이메일 foo@bar에서 올바르게 작동합니다.
extension String {
func isValidEmail() -> Bool {
do {
let regex = try NSRegularExpression(pattern: "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}", options: .CaseInsensitive)
return regex.firstMatchInString(self, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, self.characters.count)) != nil
} catch {
return false
}
}
}
Swift 4.2 사용
extension String {
func isValidEmail() -> Bool {
let regex = try? NSRegularExpression(pattern: "^(((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|\\.|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.)+(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.?$", options: .caseInsensitive)
return regex?.firstMatch(in: self, options: [], range: NSMakeRange(0, self.count)) != nil
}
func isValidName() -> Bool{
let regex = try? NSRegularExpression(pattern: "^[\\p{L}\\.]{2,30}(?: [\\p{L}\\.]{2,30}){0,2}$", options: .caseInsensitive)
return regex?.firstMatch(in: self, options: [], range: NSMakeRange(0, self.count)) != nil
} }
그리고 사용됨
if (textField.text?.isValidEmail())!
{
// bla bla
}
else
{
}
한테를수단간스니다행합트▁for▁a▁test▁simple다▁a▁make니행수에 대한 간단한 테스트를 해보세요.@
그리고..
확인 이메일을 보냅니다.
고려 사항:
- 전 세계의 절반이 비 ASC를 사용함II 캐릭터.
- 정규식은 느리고 복잡합니다.Btw z가 아닌 문자/문자/유니코드 범위를 적어도 확인합니다.
- RFC 규칙과 해당 정규식이 너무 복잡하기 때문에 전체 유효성 검사를 수행할 수 없습니다.
나는 이 기본 검사를 사용합니다.
// similar to https://softwareengineering.stackexchange.com/a/78372/22077
import Foundation
/**
Checks that
- length is 254 or less (see https://stackoverflow.com/a/574698/412916)
- there is a @ which is not the first character
- there is a . after the @
- there are at least 4 characters after the @
*/
func isValidEmail(email: String) -> Bool {
guard email.count <= 254 else {
return false
}
let pos = email.lastIndex(of: "@") ?? email.endIndex
return (pos != email.startIndex)
&& ((email.lastIndex(of: ".") ?? email.startIndex) > pos)
&& (email[pos...].count > 4)
}
print(isValidEmail(email: "アシッシュ@ビジネス.コム")) // true
참고:
정규식 및 NSDataDetector보다 상당히 빠릅니다.
다음 항목이 유효한 것으로 올바르게 보고됩니다.
Håkan.Söderström@malmö.se"
punnycode@XN--0ZWM56D.XN--HGBK6AJ7F53BBA"
试@例子.测试.مثال.آزمایشی"
foo.bar+something@blah.com"
m@foo.co.uk
- 다음은 실제로 유효하지만 사용자 오류의 결과일 가능성이 높기 때문에 잘못된 것으로 보고됩니다.
a @ b
a@b
관련:
- 이메일 주소 확인을 어디까지 받아야 합니까?
- 온라인 이메일 확인기: https://isemail.info/
@JeffersonBe의 대답은 가까웠지만, 돌아옵니다.true
문자열이 "someone@something.com 이 포함된 유효한 전자 메일"인 경우 이는 우리가 원하는 것이 아닙니다.다음은 String에서 잘 작동하는 확장 기능입니다(그리고 부팅할 유효한 phoneNumber 및 기타 데이터 디텍터를 테스트할 수 있습니다).
/// Helper for various data detector matches.
/// Returns `true` iff the `String` matches the data detector type for the complete string.
func matchesDataDetector(type: NSTextCheckingResult.CheckingType, scheme: String? = nil) -> Bool {
let dataDetector = try? NSDataDetector(types: type.rawValue)
guard let firstMatch = dataDetector?.firstMatch(in: self, options: NSRegularExpression.MatchingOptions.reportCompletion, range: NSRange(location: 0, length: length)) else {
return false
}
return firstMatch.range.location != NSNotFound
// make sure the entire string is an email, not just contains an email
&& firstMatch.range.location == 0
&& firstMatch.range.length == length
// make sure the link type matches if link scheme
&& (type != .link || scheme == nil || firstMatch.url?.scheme == scheme)
}
/// `true` iff the `String` is an email address in the proper form.
var isEmail: Bool {
return matchesDataDetector(type: .link, scheme: "mailto")
}
/// `true` iff the `String` is a phone number in the proper form.
var isPhoneNumber: Bool {
return matchesDataDetector(type: .phoneNumber)
}
/// number of characters in the `String` (required for above).
var length: Int {
return self.characters.count
}
단순 확장자 만들기:
extension NSRegularExpression {
convenience init(pattern: String) {
try! self.init(pattern: pattern, options: [])
}
}
extension String {
var isValidEmail: Bool {
return isMatching(expression: NSRegularExpression(pattern: "^[A-Z0-9a-z\\._%+-]+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}$"))
}
//MARK: - Private
private func isMatching(expression: NSRegularExpression) -> Bool {
return expression.numberOfMatches(in: self, range: NSRange(location: 0, length: characters.count)) > 0
}
}
예:
"b@bb.pl".isValidEmail //true
"b@bb".isValidEmail //false
필요한 항목으로 할 수 .isValidPhoneNumber
,isValidPassword
타기......
입력 유효성 검사를 위해 설계된 라이브러리를 만들었는데 "모듈" 중 하나를 사용하면 여러 가지를 쉽게 유효성 검사할 수 있습니다.
전자 메일의 유효성을 확인하는 예:
let emailTrial = Trial.Email
let trial = emailTrial.trial()
if(trial(evidence: "test@test.com")) {
//email is valid
}
스위프트캅은 도서관...도움이 되길 바랍니다!
Swift 2.2에 대한 답변 @Arsonik 답변 업데이트, 제공된 다른 솔루션보다 자세한 코드 사용:
extension String {
func isValidEmail() -> Bool {
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?.firstMatchInString(self, options: [], range: NSMakeRange(0, self.characters.count)) != nil
}
}
할 수 의 경우에는 응목제것은경다우니입리의눅스답추가가한록에▁for▁addition▁that▁my▁be다▁would▁to니입니다.NSRegularExpression
. 존하지않다니습, 은사실재입니다.RegularExpression
func isEmail() -> Bool {
let patternNormal = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"
#if os(Linux)
let regex = try? RegularExpression(pattern: patternNormal, options: .caseInsensitive)
#else
let regex = try? NSRegularExpression(pattern: patternNormal, options: .caseInsensitive)
#endif
return regex?.firstMatch(in: self, options: [], range: NSMakeRange(0, self.characters.count)) != nil
이것은 macOS와 Ubuntu 모두에서 성공적으로 컴파일됩니다.
스위프트 3의 확장 버전입니다.
extension String {
func isValidEmail() -> Bool {
let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
return NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluate(with: self)
}
}
다음과 같이 사용합니다.
if yourEmailString.isValidEmail() {
//code for valid email address
} else {
//code for not valid email address
}
최적의 결과를 제공하는 최고의 솔루션
스위프트 4.x
extension String {
func validateAsEmail() -> Bool {
let emailRegEx = "(?:[a-zA-Z0-9!#$%\\&‘*+/=?\\^_`{|}~-]+(?:\\.[a-zA-Z0-9!#$%\\&'*+/=?\\^_`{|}" +
"~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\" +
"x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-" +
"z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-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]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21" +
"-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"
let emailTest = NSPredicate(format:"SELF MATCHES[c] %@", emailRegEx)
return emailTest.evaluate(with: self)
}
}
저는 @Azik 답변을 개선했습니다.가이드라인에서 허용하는 특수 문자를 더 허용하고 추가 에지 사례 몇 개를 무효로 반환합니다.
그 단체는 여기서 계속되는 것이 단지 허용된다고 생각합니다.._%+-
가이드라인에 따라 로컬 부분이 올바르지 않습니다.이 질문에 대한 @Anton Gogolev 답변을 참조하거나 아래를 참조하십시오.
이메일 주소의 로컬 부분에는 다음과 같은 ASCII 문자를 사용할 수 있습니다.
대문자와 소문자의 라틴 문자
A
로.Z
그리고.a
로.z
;숫자들
0
로.9
;특수 문자
!#$%&'*+-/=?^_`{|}~
;점
.
따옴표로 묶지 않는 한 첫 문자 또는 마지막 문자가 아니며 따옴표로 묶지 않는 한 연속적으로 나타나지 않는 경우(예:John..Doe@example.com
허용되지 않지만"John..Doe"@example.com
허용됨);공간 및
"(),:;<>@[\]
문자는 제한 사항과 함께 사용할 수 있습니다(아래 단락에 설명된 대로 따옴표로 묶은 문자열 내부에서만 사용할 수 있으며, 백슬래시 또는 이중 괄호 앞에 백슬래시가 있어야 함). 주석이 허용됩니다.로컬 파트의 양쪽 끝에 괄호가 있는 경우(예:
john.smith(comment)@example.com
그리고.(comment)john.smith@example.com
둘 다 같은 값입니다.john.smith@example.com
;
내가 사용하는 코드는 제한된 특수 문자를 허용하지 않지만 여기서 대부분의 답변보다 더 많은 옵션을 허용합니다.저는 주의 측면에서 실수보다는 좀 더 완화된 검증을 선호합니다.
if enteredText.contains("..") || enteredText.contains("@@")
|| enteredText.hasPrefix(".") || enteredText.hasSuffix(".con"){
return false
}
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: enteredText)
Swift 4.2 및 Xcode 10.1에서
//Email validation
func isValidEmail(email: String) -> Bool {
let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
var valid = NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluate(with: email)
if valid {
valid = !email.contains("Invalid email id")
}
return valid
}
//Use like this....
let emailTrimmedString = emailTF.text?.trimmingCharacters(in: .whitespaces)
if isValidEmail(email: emailTrimmedString!) == false {
SharedClass.sharedInstance.alert(view: self, title: "", message: "Please enter valid email")
}
공유 클래스를 사용하려는 경우.
//This is SharedClass
import UIKit
class SharedClass: NSObject {
static let sharedInstance = SharedClass()
//Email validation
func isValidEmail(email: String) -> Bool {
let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
var valid = NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluate(with: email)
if valid {
valid = !email.contains("Invalid email id")
}
return valid
}
private override init() {
}
}
그리고 이렇게 호출 기능을...
if SharedClass.sharedInstance. isValidEmail(email: emailTrimmedString!) == false {
SharedClass.sharedInstance.alert(view: self, title: "", message: "Please enter correct email")
//Your code here
} else {
//Code here
}
다음은 표준 라이브러리를 사용하여 정규식을 유지할 필요가 없는 최신 놀이터 호환 버전입니다.
import Foundation
func isValid(email: String) -> Bool {
do {
let detector = try NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)
let range = NSRange(location: 0, length: email.count)
let matches = detector.matches(in: email, options: .anchored, range: range)
guard matches.count == 1 else { return false }
return matches[0].url?.scheme == "mailto"
} catch {
return false
}
}
extension String {
var isValidEmail: Bool {
isValid(email: self)
}
}
let email = "test@mail.com"
isValid(email: email) // prints 'true'
email.isValidEmail // prints 'true'
위의 정규식 예제의 대부분은 전자 메일에 기본적인 문제가 있는 경우에도 오류를 감지하지 못합니다.예를들면
h..1@nyu.edu
연속된 점들ab1234@.nyu.edu
@ 뒤에 점을 찍다a.bcdnle12.@email.com
@ 앞에 점을 찍다.abc@email.com
점으로 시작합니다.
여기 더 엄격한 규칙이 있는 정규식을 사용하는 문자열 확장자가 있습니다.
extension String {
func isValidEmail() -> Bool {
let emailRegEx = "^(?!\\.)([A-Z0-9a-z_%+-]?[\\.]?[A-Z0-9a-z_%+-])+@[A-Za-z0-9-]{1,20}(\\.[A-Za-z0-9]{1,15}){0,10}\\.[A-Za-z]{2,20}$"
let emailPred = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
return emailPred.evaluate(with: self)
}
}
테스트 케이스를 작성하는 방법은 다음과 같습니다.
XCTAssertFalse("ab1234@.nyu.edu".isValidEmail())
XCTAssertTrue("valid_email@email.com".isValidEmail())
이상한 최상위 도메인 이름이 너무 많아서 최상위 도메인의 길이를 확인하지 않습니다...
제가 사용하는 것은 다음과 같습니다.
extension String {
func isEmail() -> Bool {
let emailRegEx = "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$"
return NSPredicate(format:"SELF MATCHES %@", emailRegEx).evaluateWithObject(self)
}
}
역시 효과가 있는 것 같군요...
let regex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
func validate(email: String) -> Bool {
let matches = email.rangeOfString(regex, options: .RegularExpressionSearch)
if let _ = matches {
return true
}
return false
}
스위프트 3의 경우:
extension String {
func isValidEmail() -> Bool {
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: NSMakeRange(0, self.characters.count)) != nil
}
}
언급URL : https://stackoverflow.com/questions/25471114/how-to-validate-an-e-mail-address-in-swift
'sourcetip' 카테고리의 다른 글
node.js에서 __dirname과 ./의 차이점은 무엇입니까? (0) | 2023.05.13 |
---|---|
VB.Net 속성 - 공용 Get, 개인 세트 (0) | 2023.05.13 |
패턴 유형을 설정했는데 EP Plus에서 "패턴 유형이 설정되지 않으면 색상을 설정할 수 없습니다"라고 표시되는 이유는 무엇입니까? (0) | 2023.05.13 |
ClickOnce 응용 프로그램의 폴더 경로를 가져오는 방법 (0) | 2023.05.13 |
정수만 사용하는 숫자 입력 유형? (0) | 2023.05.13 |