如何在swift中验证电子邮件地址?

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)

  • 它不会检查是否有可用的扩展名,@ a已经可以了:( (13认同)
  • 不会`返回emailTest.evaluateWithObject(testStr)`更简单易读?与`== true`相比有点像Javascript. (6认同)
  • 这不会验证test @ test ... com (4认同)
  • 这不会检测到电子邮件.@ invalid.com或电子邮件@ .invalid.com.@alexcristea的答案如下 (3认同)
  • 它接受以点开头的电子邮件,但它是一个 RegEx 问题 (2认同)
  • ............以及(1)完全不正确的正则表达式真是太可笑了(2)正则表达式(即使在它试图做的事情内)有严重的错误,(3)Swift是错误的(4)甚至撇开它,样式(style)完全错误(5),尽管其余所有都不重要,但是它并没有。甚至没有提到您必须“ **缓存”谓语……幽默地讲,(6)无论从何处复制代码,仍然还有“剩余的代码” **(“日历”-什么?)。 (2认同)

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)

它工作正常.

  • 这应该是最好的答案.不是那个错误的正则表达式 (9认同)
  • 第一个有效的正则表达式.其他人验证aa @ aach为true (2认同)
  • 应该选择它作为正确答案。 (2认同)
  • 它不处理域名后的两个点条件。试试这个答案 /sf/answers/3740882351/ (2认同)

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)

  • xxx @yyy返回true? (23认同)
  • `countElements`现在是`count` (4认同)
  • 没有 .tld 的 user@host 也是一个有效的电子邮件地址,例如 root@localhost (4认同)

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)

  • 哇,不知道关于emailregex.com.太棒了! (3认同)
  • 最后,一个过滤器email。@。email.com (2认同)
  • @alexcristea很好,它使用了大量的验证。 (2认同)

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工程师会知道这一点.

令人惊讶的是,本页上没有一个答案提到这一点.

请注意,这是Apple在doco中提到的第一件事!

任何不使用全局方法的解决方案都可以被描述为"非常差".

  • @Fattie,您好,您能为我们提供一个链接,Apple 在其中解释谓词必须是全局的吗?谢谢 (3认同)
  • 关于第(4)点:您是如何与许多用户进行测试的?您是否跟踪了用户,因为正则表达式确实阻止了他们使用其电子邮件地址,所以无法注册商业应用程序?唯一的“合理”应该是规范(RFC)规定的内容,或者如果无法实现,则应该放宽一些,但涵盖规范中的所有内容。如果不允许用户输入x @ x,则他们将输入将通过您/任何正则表达式的垃圾@ example.com。 (2认同)
  • 这是一个很棒的答案。我试图在用户键入时验证电子邮件 ID 并切换按钮的启用状态。对于其他正则表达式,当我输入 aaa@aaa 时该按钮会启用,然后当我添加“.”时该按钮会被禁用。。在我的例子中,这按预期工作。 (2认同)
  • 例如@Fattie“user@домен.рф”。虽然绝对有效,但它没有通过验证。 (2认同)
  • @andbi - 这是一个非常合理的观点。给出的示例(很抱歉)仅适用于英语字母表。你绝对是对的,在很多情况下,程序员会添加外来字母。这是最重要的一点,谢谢你提到这一点。 (2认同)

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)

  • foo @ bar返回true?! (8认同)
  • 那是因为RFC验证这些电子邮件地址是真的;) (3认同)
  • 验证aa @ aach为true (2认同)

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)

  • 请注意,NSRange 长度属性应使用 String utf16.count 而不是 strings.count (2认同)

Ken*_*ler 10

Swift 5中最简单的方法

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)

  • 重复重复的答案有什么意义?它不依赖于任何 Swift 5 功能 (7认同)

And*_*ndo 9

这里有很多正确的答案,但许多"正则表达式"都是不完整的,可能会发生如下邮件:"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)


zap*_*aph 8

这是一种基于以下方法的方法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等语言所要求的转义.

  • 您使用的 emailRegEx 完全是错误的。它只允许 TLD 长度为 2 到 4 个字符,而存在“.engineer”等域名。 (2认同)

Mar*_*uiz 7

我更喜欢使用扩展名.此外,这个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)


Ale*_*ván 6

这是@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)

我只是不喜欢一个添加funcString对象,作为一个电子邮件地址是固有他们(或没有)。因此,根据我的理解,Bool属性比 a 更适合func


lee*_*783 5

对于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)


ikb*_*bal 5

使用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)


Jan*_*ano 5

@对和进行简单测试.并发送确认电子邮件。

\n

考虑一下:

\n
    \n
  • 世界上一半的人使用非 ASCII 字符。
  • \n
  • 正则表达式缓慢且复杂。顺便说一句,至少检查字符/字母/Unicode 范围,而不是 az。
  • \n
  • 您无法\xe2\x80\x99 承担完整的验证,因为 RFC 规则和相应的正则表达式太复杂。
  • \n
\n

I\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\n
Run Code Online (Sandbox Code Playgroud)\n

注意

\n
    \n
  • 它比正则表达式和 NSDataDetector 快得多。

    \n
  • \n
  • 它正确地将以下内容报告为有效:

    \n
  • \n
\n
H\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\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 它错误地将以下内容报告为无效 \xe2\x80\x93,因为它们实际上有效,但可能是用户错误的产物:
  • \n
\n
a @ b\na@b\n
Run Code Online (Sandbox Code Playgroud)\n

有关的:

\n\n