29

我已经在字符串扩展中编写了这个函数,但无法找出错误。

func isEmail() -> Bool {
    let regex = NSRegularExpression(pattern: "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$", options: [.CaseInsensitive])

    return regex.firstMatchInString(self, options: nil, range: NSMakeRange(0, characters.count)) != nil
}

错误是:

call 可以抛出,但是没有标记 'try' 并且错误没有处理

4

4 回答 4

55

NSRegularExpression(pattern:)如果模式无效,则抛出错误。在您的情况下,模式是固定的,因此无效模式将是编程错误

这是“强制尝试”表达式的用例try!

extension String {
    func isEmail() -> Bool {
        let regex = try! NSRegularExpression(pattern: "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$",
            options: [.CaseInsensitive])

        return regex.firstMatchInString(self, options:[],
            range: NSMakeRange(0, utf16.count)) != nil
    }
}

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

另请注意,它NSRange()计算 的长度NSString,即 UTF-16 代码点的数量,因此 characters.count应该是utf16.count,否则它可能会崩溃,例如使用表情符号字符。

于 2015-06-15T13:05:54.697 回答
13

那是因为该初始化程序现在可以抛出异常,因此您需要try调用它并为catch异常做好准备。您可以通过try在初始化程序之前添加并使用throws.

extension String {
    func isEmail() throws -> Bool {
        let regex = try NSRegularExpression(pattern: "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$", options: [.CaseInsensitive])

        return regex.firstMatchInString(self, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, characters.count)) != nil
    }
}

然后,当您要调用该方法时,请从do块中执行此操作并捕获出现的错误。

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

注意:我还更新了您的regex.firstMatchInString调用以反映options参数不能再采用 nil 值的事实。

于 2015-06-15T12:53:55.190 回答
3

如果你不喜欢尝试 catch :

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
    }
}    

检查字符串是否正确的电子邮件格式:

let emailInput:String = "checkthis@gmail.com"
if (emailInput.matchPattern("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$"))
{
     print("this is e-mail!")
}
于 2015-12-30T04:36:26.680 回答
1

您可以使用 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
}
于 2016-05-11T09:10:43.913 回答