调用可以抛出,但没有用'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
调用它,并准备好catch
exception。 您可以通过在初始化程序之前添加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 }