Gio*_*era 305 email validation ios swift
有谁知道如何在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;
}
}
Run Code Online (Sandbox Code Playgroud)
但我不能把它翻译成斯威夫特.
Max*_*tin 718
我会用NSPredicate:
func isValidEmail(emailStr: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: emailStr)
}
Run Code Online (Sandbox Code Playgroud)
对于早于3.0的Swift版本:
func isValidEmail(emailStr: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: emailStr)
}
Run Code Online (Sandbox Code Playgroud)
对于早于1.2的Swift版本:
class func isValidEmail(emailStr: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(emailStr)
}
return false
}
Run Code Online (Sandbox Code Playgroud)
Azi*_*lah 110
编辑,更新为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)
}
Run Code Online (Sandbox Code Playgroud)
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)
}
Run Code Online (Sandbox Code Playgroud)
它工作正常.
Ars*_*nik 104
作为String班级延伸
SWIFT 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
}
}
Run Code Online (Sandbox Code Playgroud)
用法
if "rdfsdsfsdfsd".isValidEmail() {
}
Run Code Online (Sandbox Code Playgroud)
ale*_*tea 49
如果您正在寻找一个干净简单的解决方案来执行此操作,您应该查看https://github.com/nsagora/validation-components.
它包含一个电子邮件验证谓词,可以轻松集成到您的代码中:
let email = "test@example.com"
let rule = EmailValidationPredicate()
let isValidEmail = rule.evaluate(with: email)
Run Code Online (Sandbox Code Playgroud)
在引擎盖后面它使用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])+)\\])"
Run Code Online (Sandbox Code Playgroud)
Fat*_*tie 31
这是合理的解决方案:
1 - 它避免了你经常在这些建议中看到的许多正则表达式错误
2 -它不会让笨电邮,例如"X @ X",这在技术上是有效的,但完全是愚蠢的-和你的支持人员,等等,反正会立即拒绝.如果您需要允许使用愚蠢电子邮件的解决方案,请使用其他解决方案.
3 - 这是非常容易理解的
4 - KISS,可靠,经过测试,可以破坏拥有大量用户的商业应用程序
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()
}
}
Run Code Online (Sandbox Code Playgroud)
在以下描述中,"OC"表示普通字符:因此,字母或数字.
__firstpart ...必须以OC开始和结束.对于中间的字符,你可以有一些不寻常的字符,如下划线,但开始和结束必须是OC.(只有一个OC就可以了,例如:j@blah.com)
__serverpart ...你有像"等等"的部分.重复一遍.(所以,mail.city.fcu.edu类型的东西.)这些部分必须以OC开头和结尾,但在中间你也可以使用短划线" - ".(如果你想在其中允许其他不寻常的字符,请说明下划线,只需在短划线之前添加它.)可以有一个只有一个OC的部分.(如joe@w.campus.edu)你最多可以有五个部分; 你必须有一个.最后,TLD(例如.com)的大小严格为2到8.
请注意,您只需将谓词保持为全局(在Swift中无关紧要),无需每次都构建它.
最初级的专业iOS工程师会知道这一点.
令人惊讶的是,本页上没有一个答案提到这一点.
任何不使用全局方法的解决方案都可以被描述为"非常差".
Nic*_*ini 24
以下是使用谓词进行字符串扩展的两个最高投票答案的融合:所以你可以调用string.isEmail
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)
}
}
Run Code Online (Sandbox Code Playgroud)
小智 15
这是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
}
}
Run Code Online (Sandbox Code Playgroud)
Jef*_*nBe 15
我建议使用它作为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
}
}
Run Code Online (Sandbox Code Playgroud)
并使用它:
if "hodor@gameofthrones.com".isEmail { // true
print("Hold the Door")
}
Run Code Online (Sandbox Code Playgroud)
Ken*_*ler 10
extension String {
var isValidEmail: Bool {
return NSPredicate(format: "SELF MATCHES %@", "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}").evaluate(with: self)
}
}
Run Code Online (Sandbox Code Playgroud)
例
"kenmueller0@gmail.com".isValidEmail
Run Code Online (Sandbox Code Playgroud)
返回...
true
Run Code Online (Sandbox Code Playgroud)
这里有很多正确的答案,但许多"正则表达式"都是不完整的,可能会发生如下邮件:"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
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是一种基于以下方法的方法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)
let result = range != nil ? true : false
return result
}
Run Code Online (Sandbox Code Playgroud)
注意:更新的TLD长度.
以下是根据RFC 5322确定的电子邮件RegEx,请注意,最好不要使用它,因为它只检查电子邮件地址的基本语法,而不检查是否存在顶级域.
(?:[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])+)
\])
见Regular-Expressions.info有关电子邮件RegExs更全面的信息.
请注意,没有像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)
}
}
Run Code Online (Sandbox Code Playgroud)
这是@Fattie 的“合理解决方案”的新版本,在 Swift 4.1 上的一个名为 的新文件中进行了测试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)
}
}
Run Code Online (Sandbox Code Playgroud)
所以它的用法很简单:
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")
}
Run Code Online (Sandbox Code Playgroud)
我只是不喜欢一个添加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
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用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
} }
Run Code Online (Sandbox Code Playgroud)
和二手
if (textField.text?.isValidEmail())!
{
// bla bla
}
else
{
}
Run Code Online (Sandbox Code Playgroud)
@对和进行简单测试.并发送确认电子邮件。
考虑一下:
\nI\xe2\x80\x99m 使用此基本检查:
\n// similar to https://softwareengineering.stackexchange.com/a/78372/22077\nimport Foundation\n\n/**\n Checks that\n - length is 254 or less (see https://stackoverflow.com/a/574698/412916)\n - there is a @ which is not the first character\n - there is a . after the @\n - there are at least 4 characters after the @\n*/\nfunc isValidEmail(email: String) -> Bool {\n guard email.count <= 254 else { \n return false \n }\n let pos = email.lastIndex(of: "@") ?? email.endIndex\n return (pos != email.startIndex)\n && ((email.lastIndex(of: ".") ?? email.startIndex) > pos) \n && (email[pos...].count > 4)\n}\n\nprint(isValidEmail(email: "\xe3\x82\xa2\xe3\x82\xb7\xe3\x83\x83\xe3\x82\xb7\xe3\x83\xa5@\xe3\x83\x93\xe3\x82\xb8\xe3\x83\x8d\xe3\x82\xb9.\xe3\x82\xb3\xe3\x83\xa0")) // true\nRun Code Online (Sandbox Code Playgroud)\n注意
\n它比正则表达式和 NSDataDetector 快得多。
\n它正确地将以下内容报告为有效:
\nH\xc3\xa5kan.S\xc3\xb6derstr\xc3\xb6m@malm\xc3\xb6.se"\npunnycode@XN--0ZWM56D.XN--HGBK6AJ7F53BBA"\n\xe8\xaf\x95@\xe4\xbe\x8b\xe5\xad\x90.\xe6\xb5\x8b\xe8\xaf\x95.\xd9\x85\xd8\xab\xd8\xa7\xd9\x84.\xd8\xa2\xd8\xb2\xd9\x85\xd8\xa7\xdb\x8c\xd8\xb4\xdb\x8c"\nfoo.bar+something@blah.com"\nm@foo.co.uk\nRun Code Online (Sandbox Code Playgroud)\na @ b\na@b\nRun Code Online (Sandbox Code Playgroud)\n有关的:
\n| 归档时间: |
|
| 查看次数: |
173195 次 |
| 最近记录: |