有谁知道如何在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;
}
}
但我不能把它翻译成斯威夫特 .
30 回答
我会用
NSPredicate
:对于早于3.0的Swift版本:
对于早于1.2的Swift版本:
作为
String
类扩展SWIFT 4
用法
编辑,更新为Swift 3:
Swift 2的原始答案:
它工作正常 .
由于现在有这么多奇怪的顶级域名,我停止检查顶级域名的长度...
这是我使用的:
似乎也工作......
如果您正在寻找一个干净而简单的解决方案来执行此操作,您应该查看https://github.com/nsagora/validation-components .
它包含一个电子邮件验证谓词,可以轻松集成到您的代码中:
在引擎盖后面它使用RFC 5322 reg ex(http://emailregex.com):
以下是使用谓词进行字符串扩展的两个最高投票答案的融合:所以你可以调用string.isEmail
这是合理的解决方案:
“合理的解决方案”
在许多大批量应用程序中使用和测试多年 .
1 - 它避免了你经常在这些建议中看到的很多东西
2 - 它 does not 允许愚蠢的电子邮件,例如"x@x",它们在技术上是有效的,但是完全是愚蠢的 - 而且你的支持人员等,无论如何都会立即拒绝 . 如果您需要允许使用愚蠢电子邮件的解决方案,请使用其他解决方案 .
3 - 非常 understandable
4 - 这是KISS,可靠, tested to destruction on commercial apps with enormous numbers of users
说明:
在以下描述中,“OC”表示普通字符:因此,字母或数字 .
__firstpart ...必须以OC开始和结束 . 对于中间的字符,你可以有一些不寻常的字符,如下划线,但开始和结束必须是OC . (只有一个OC就可以了,例如:j@blah.com)
__serverpart ...你有像“等等”的部分 . 重复一遍 . (所以,mail.city.fcu.edu类型的东西 . )这些部分必须以OC开头和结尾,但在中间你也可以使用短划线“ - ” . (如果你想在其中允许其他不寻常的字符,请说明下划线,只需在短划线之前添加它 . )可以有一个只有一个OC的部分 . (如joe@w.campus.edu)你最多可以有五个部分;你必须有一个 . 最后,TLD(例如.com)的大小严格为2到8 .
令人惊讶......
Note that you simply keep the predicate as a global (trivial in Swift), no need to build it every time.
最初级的专业iOS工程师会知道这一点 .
令人惊讶的是,本页上没有一个答案提到这一点 .
请注意,这是苹果公司在doco中提到的第一件事!
任何不使用全局方法的解决方案都可以被描述为“非常差” .
这是Swift 2.0 - 2.2的更新版本
我建议使用它作为String的扩展:
并使用它:
这是一个基于
rangeOfString
的方法:注意:更新的TLD长度 .
以下是根据RFC 5322确定的电子邮件RegEx,请注意,最好不要使用它,因为它只检查电子邮件地址的基本语法,而不检查是否存在顶级域 .
有关电子邮件RegEx的更多完整信息,请参阅Regular-Expressions.info .
请注意,没有像Objective-C或Swift等语言所要求的转义 .
更新了答案@Arsonik回答Swift 2.2,使用比其他提供的解决方案更简洁的代码:
这里有很多正确的答案,但许多“正则表达式”都是不完整的,可能会发生如下邮件:“name @ domain”会产生有效的电子邮件,但事实并非如此 . 完整的解决方案:
我更喜欢使用扩展名 . 此外,这个url http://emailregex.com可以帮助你测试正则表达式是否正确 . 实际上,该站点为某些编程语言提供了不同的实现 . 我分享了 Swift 3 的实现 .
对于swift 2.1:这适用于电子邮件foo @ bar
创建简单扩展:
例:
您可以将以下扩展名扩展为您需要的任何内容:
isValidPhoneNumber
,isValidPassword
等...使用Swift 4.2
并使用
我创建了一个专为输入验证而设计的库,其中一个“模块”允许您轻松验证一堆内容......
例如,验证电子邮件:
SwiftCop是图书馆......希望它有所帮助!
这是@Fattie的 "THE REASONABLE SOLUTION" 的新版本,在一个名为
String+Email.swift
的新文件中测试了Swift 4.1:所以它的用法很简单:
一世根本不喜欢将
func
添加到String
对象,因为它们是(或不是)固有的电子邮件地址 . 因此,根据我的理解,Bool
属性比func
更合适 .在 Swift 4.2 和Xcode 10.1中
如果要使用SharedClass .
并调用这样的函数....
@ JeffersonBe的答案很接近,但如果字符串是"something containing someone@something.com a valid email"则返回
true
,这不是我们想要的 . 以下是String的扩展,运行良好(并允许测试有效的phoneNumber和其他数据检测器启动 .并为 Swift 3 :
我对响应列表的唯一补充是,对于Linux,
NSRegularExpression
不存在,它实际上是RegularExpression
这在macOS和Ubuntu上都能成功编译 .
这是Swift 3的扩展
只需像这样使用它:
100% working and tested
最好的解决方案,最好的结果
我喜欢创建扩展
用法:
我改进了@Azik的答案 . 我允许指南允许的更多特殊字符,以及返回一些额外的边缘情况作为无效 .
该小组认为,这里只允许
._%+-
在本地部分根据指南不正确 . 请参阅@Anton Gogolev回答this问题或参见下文:我使用的代码不允许限制不合适的特殊字符,但会允许比这里的大多数答案更多的选项 . 我希望在谨慎方面更轻松地验证错误 .
或者您可以为UITextField的可选文本添加扩展名:
如何使用:
延期:
这是当前Swiftmailer中一种非常简单的方法 . 大多数其他答案都很陈旧,重新发明轮子 .
根据Swiftmailer文档:https://swiftmailer.symfony.com/docs/messages.html#quick-reference
这是迄今为止最简单,最强大的方法,即imo . 只需通过Composer安装Egulias \ EmailValidator库,该库本来应该作为SwiftMailer的依赖项引入 .