2015-06-15 2 views
28

Ich habe diese Funktion in String Extension geschrieben und kann den Fehler nicht herausfinden.Call kann werfen, aber es ist nicht mit "versuchen" markiert und der Fehler wird nicht behandelt: NSRegularExpression

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

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

Der Fehler ist:

Call can throw, but it is not marked with 'try' and the error is not handled

Antwort

55

NSRegularExpression(pattern:) gibt einen Fehler aus, wenn das Muster ungültig ist. In Ihrem Fall ist das Muster fest, so ein ungültiges Muster wäre ein Programmierfehler.

Dies ist ein Anwendungsfall für die „Zwangs-versuchen“ Ausdruck mit try!:

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

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

try! die Fehlerfortpflanzung sperrt, so dass das Verfahren keinen Fehler werfen (die die Anrufer zu fangen haben). Es wird mit einer Laufzeitausnahmebedingung abgebrochen, wenn das Muster ungültig ist, was dazu beiträgt, Programmierfehler früh zu finden .

beachte auch, dass NSRange() zählt die Länge des NSString, das heißt die Anzahl der UTF-16-Codepunkte, so characters.count sollte utf16.count sein, sonst könnte es abstürzen z.B. mit Emoji-Zeichen.

+0

http://emailregex.com/ schlägt leicht unterschiedliche Muster - '[A-Z0-9a-z ._% + -] + @ [A-Za-Z0-9 .-] + \\ [A-Za-z] {2,6} speziell für Swift. Was denken Sie? – Michal

+0

@Michal: Der obige Code verwendet die '. CaseInsensitive "-Option für die Groß- und Kleinschreibung, und Ihr Muster ermöglicht Groß- und Kleinbuchstaben. Das Ergebnis ist das gleiche. –

+0

extra plus für den Hinweis auf den Emoji-Fall! – Kubba

13

Das liegt daran, dass initializer jetzt eine Ausnahme auslösen kann, so dass Sie try müssen es nennen und zu catch die Ausnahme hergestellt werden. Sie können dies tun, indem Sie vor dem Initialisierer try hinzufügen und Ihre Methode mit throws annotieren.

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

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

Dann, wenn Sie die Methode aufrufen wollen, tun Sie es aus einem do Block und den Fehler fangen, das herauskommt.

do { 
    try "[email protected]".isEmail() 
} catch { 
    print(error) 
} 

Hinweis: Ich habe auch Ihre regex.firstMatchInString Aufruf aktualisiert, um die Tatsache widerzuspiegeln, dass die options Parameter nicht mehr einen Nullwert nehmen.

3

Wenn Sie nicht wie try 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 
    } 
}  

Check-String ist korrekte E-Mail-Format:

let emailInput:String = "[email protected]" 
if (emailInput.matchPattern("^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\\.[A-Z]{2,4}$")) 
{ 
    print("this is e-mail!") 
} 
1

Sie string.rangeOfString verwenden könnte, und geben Sie die Option .RegularExpressionSearch. Es ist einfach.

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

könnten Sie bitte Ihre Lösung mit ein bisschen mehr Details bearbeiten? – Whitefret

+0

Ich bekomme den folgenden Fehler, wenn ich dies in Swift 3 versuche: ** Fett ** 'Ausführung fehlgeschlagen: Fehler: Patterns.playground: 2: 12: Fehler: Wert des Typs 'String' hat kein Mitglied 'rangeOfString' Rücksende-E-Mail .rangeOfString ("^ [A-Z0-9a-z ._% + -] + @ [A-Za-z0-9 .-] + \\. [A-Za-z] {2,6} $" , Optionen: .RegularExpressionSearch)! = nil'. Für die von Ihnen verwendete Zeichenfolge muss eine Erweiterung vorhanden sein, die standardmäßig nicht enthalten ist. –