调用可以抛出,但没有用'try'标记,错误不被处理:NSRegularExpression

我已经写了这个函数在string扩展,并不能找出错误。

func isEmail() -> Bool { let regex = NSRegularExpression(pattern: "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[AZ]{2,4}$", options: [.CaseInsensitive]) return regex.firstMatchInString(self, options: nil, range: NSMakeRange(0, characters.count)) != nil } 

错误是:

调用可以抛出,但没有用“try”标记,并且不处理错误

如果模式无效, NSRegularExpression(pattern:)会引发一个错误。 在你的情况下,模式是固定的 ,所以一个无效的模式将是一个编程错误

这是“强制尝试”expression式的用法,请try!

 extension String { func isEmail() -> Bool { let regex = try! NSRegularExpression(pattern: "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[AZ]{2,4}$", options: [.CaseInsensitive]) return regex.firstMatchInString(self, options:[], range: NSMakeRange(0, utf16.count)) != nil } } 

try! 禁用错误传播,以便该方法不会抛出错误(调用者必须捕获)。 如果模式无效,它会以运行时exception中止,这有助于及早发现编程错误。

还要注意的是, NSRange()计算NSString的长度,即UTF-16代码点的数量,所以characters.count应该是utf16.count ,否则它可能会崩溃,例如使用Emoji字符。

这是因为初始化器现在可以抛出一个exception,所以你需要try调用它,并准备好catchexception。 您可以通过在初始化程序之前添加try并用throws注释您的方法来完成此操作。

 extension String { func isEmail() throws -> Bool { let regex = try NSRegularExpression(pattern: "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[AZ]{2,4}$", options: [.CaseInsensitive]) return regex.firstMatchInString(self, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, characters.count)) != nil } } 

然后当你想调用这个方法的时候,从一个do块里面do并且捕获出来的错误。

 do { try "person@email.com".isEmail() } catch { print(error) } 

注意:我还更新了regex.firstMatchInString调用,以反映options参数不能再取值为零的事实。

如果你不喜欢试试看:

 extension String { func matchPattern(patStr:String)->Bool { var isMatch:Bool = false do { let regex = try NSRegularExpression(pattern: patStr, options: [.CaseInsensitive]) let result = regex.firstMatchInString(self, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, characters.count)) if (result != nil) { isMatch = true } } catch { isMatch = false } return isMatch } } 

检查string是否正确邮件格式:

 let emailInput:String = "checkthis@gmail.com" if (emailInput.matchPattern("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[AZ]{2,4}$")==true) { print("this is e-mail!") } 

你可以使用string.rangeOfString,并指定.RegularExpressionSearch选项。 这很简单。

 func isEmail(email: String) -> Bool { return email.rangeOfString("^[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}$", options: .RegularExpressionSearch) != nil }