web-dev-qa-db-ja.com

呼び出しはスローできますが、「try」でマークされておらず、エラーは処理されません:NSRegularExpression

この関数をString Extensionで記述しましたが、エラーを理解できません。

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
}

エラーは次のとおりです。

呼び出しはスローできますが、「try」でマークされておらず、エラーは処理されません

28
Sahil Kapoor

パターンが無効な場合、NSRegularExpression(pattern:)はエラーをスローします。あなたの場合、パターンはfixedなので、無効なパターンはprogramming errorになります。

これは、_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_でなければなりません。絵文字を使用します。

55
Martin R

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 = "[email protected]"
if (emailInput.matchPattern("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$"))
{
     print("this is e-mail!")
}
3
Chris Ho

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