2015-06-23 12 views
6

Ich versuche, URLs im Text zu erhalten. Also, bevor ich verwendet einen solchen Ausdruck:Regulärer Ausdruck, um URL in String Swift mit großgeschriebenen Symbolen

let re = NSRegularExpression(pattern: "https?:\\/.*", options: nil, error: nil)! 

Aber ich hatte ein Problem, wenn ein Benutzer Eingabe von URLs mit Aktivierte Symbolen (wie Http://Google.com, ist es nicht zusammenpassen).

Ich habe versucht:

let re = NSRegularExpression(pattern: "(h|H)(t|T)(t|T)(p|P)s?:\\/.*", options: nil, error: nil)! 

Aber nichts geschah.

+0

Wahrscheinlich, weil Sie noch nicht über ein Kapital 's'? –

+1

Verwenden Sie stattdessen eine Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung?Es gibt eine [Frage hier] (http://stackoverflow.com/questions/26823147/does-nsregularexpression-support-partial-case-insensitive) über dies teilweise zu tun, um die Leistung zu halten. – arco444

+0

Ich kann verstehen, warum Stack URLs nicht zeigt. Sauen Sie den Text ist Http://Google.ru – nabiullinas

Antwort

5

Sie deaktivieren die Berücksichtigung der Groß-/Kleinschreibung unter Verwendung eines i Inline-Flags in Regex, siehe Foundation Framework Reference für weitere Informationen zu verfügbaren Regex-Funktionen.

(?ismwx-ismwx)
Flag-Einstellungen. Ändern Sie die Flaggeneinstellungen. Änderungen gelten für den Teil des Musters, der auf die Einstellung folgt. Zum Beispiel ändert sich (? I) zu einer Übereinstimmung, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird. Die Flags werden in Flag-Optionen definiert.

Für Leser:

Passende eine URL innerhalb größere Texte ist bereits ein solvedproblem, aber für diesen Fall ein simple regex wie

(?i)https?://(?:www\\.)?\\S+(?:/|\\b) 

als OP tun erfordert Passen Sie nur die URLs an, die mit http oder https oder HTTPs usw. beginnen.

+0

Funktioniert nicht - Eingabe - Test Web http://google.com/hp neuer Test in Ordnung tschüss Ausgabe - http://google.com/hp neuer Test in Ordnung tschüss – Deb

+0

Was meinst du? Könnten Sie einen * sichtbaren * Beweis dafür einreichen, dass er nicht funktioniert? Der Punkt hier ist, dass "Http: // Google.com" und "http: // google.com" mit "http: //" übereinstimmen sollten. '(? i)' schaltet die Groß-/Kleinschreibung vom Muster ab. –

+0

Bitte überprüfen Sie dies - http://www.rubular.com/r/onCJeLjrho – Deb

1

Versuchen Sie dies - http: // ([- \ w \.] +) + (: \ D +)? (/ ([\ W/_ \.] * (\? \ S +)?)?)

let pattern = "http?://([-\\w\\.]+)+(:\\d+)?(/([\\w/_\\.]*(\\?\\S+)?)?)?" 
    var matches = [String]() 
    do { 
     let regex = try NSRegularExpression(pattern: pattern, options: NSRegularExpressionOptions(rawValue: 0)) 
     let nsstr = text as NSString 
     let all = NSRange(location: 0, length: nsstr.length) 
     regex.enumerateMatchesInString(text, options: NSMatchingOptions.init(rawValue: 0), range: all, usingBlock: { (result, flags, _) in 
      matches.append(nsstr.substringWithRange(result!.range)) 
     }) 
    } catch { 
     return [String]() 
    } 
    return matches 
+0

Es ist absolut nicht notwendig, einen Punkt innerhalb einer Zeichenklasse zu verlassen. Warum so viele einfangende Gruppen verwenden? Du verwendest keine. –

+0

Danke für deinen Kommentar, aber hast du den Testfall überprüft, den ich gegen deinen Kommentar gepostet habe? Danke – Deb

+0

Versuchte es und fand Debs Antwort kann genau die URL entsprechen. Stribizhevs Antwort wird von http bis zum Ende der Zeile passen, was keine legale URL ist. – Ripley

1

eine exension Schnur Make

extension String { 
var isAlphanumeric: Bool { 
    return rangeOfString("^[wW]{3}+.[a-zA-Z]{3,}+.[a-z]{2,}", options: .RegularExpressionSearch) != nil 
} 
} 

Aufruf wie dieses

"www.testsite.edu".isAlphanumeric // true 
"flsd.testsite.com".isAlphanumeric //false 
0
mit

Erstellen Sie einfach Mine, die ziemlich gut und seine leicht zu ändern funktioniert.

func isValidURL() -> Bool { var isValid = false

if !self.containsString("..") { 
     let head  = "((http|https)://)?([(w|W)]{3}+\\.)?" 
     let tail  = "\\.+[A-Za-z]{2,3}+(\\.)?+(/(.)*)?" 

     let urlRegEx = head+"+(.)+"+tail 

     let urlTest = NSPredicate(format:"SELF MATCHES %@", urlRegEx) 
     isValid = urlTest.evaluateWithObject(self.trim()) 
    } 
    return isValid 
} 

es Anruf direkt oder in einem String-Erweiterung wie diese

import Foundation 
extension String { 

    func isValidURL() -> Bool { 
    var isValid = false 

    if !self.containsString("..") { 
     let head  = "((http|https)://)?([(w|W)]{3}+\\.)?" 
     let tail  = "\\.+[A-Za-z]{2,3}+(\\.)?+(/(.)*)?" 

     let urlRegEx = head+"+(.)+"+tail 

     let urlTest = NSPredicate(format:"SELF MATCHES %@", urlRegEx) 
     isValid = urlTest.evaluateWithObject(self.trim()) 
    } 
    return isValid 
    } 
} 

Und nennen Sie es so

let newUrl = "www.google.com" 
let isValid = newUrl.isValid()