2015-06-23 9 views
6

Próbuję uzyskać adresy URL w tekście. Tak więc, przed, użyłem takiego wyrażenia:Wyrażenie regularne w celu uzyskania adresu URL w ciągi swift z symbolami pisanymi wielkimi literami

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

Ale miałem problem, gdy użytkownik adresy wejściowe z symbolami Kapitalizowane (jak Http://Google.com, to nie ma go dopasować).

Próbowałem:

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

Ale nic się nie stało.

+0

prawdopodobnie dlatego, że nadal nie ma kapitału 's'? –

+1

Zamiast tego użyj dopasowania niewrażliwego na wielkość liter?Istnieje [pytanie tutaj] (http://stackoverflow.com/questions/26823147/does-nsregularexpression-support-partial-case-insensitive) o częściowym wykonaniu w celu zachowania wydajności. – arco444

+0

Rozumiem, dlaczego stos nie wyświetla adresów URL. Sow tekst jest Http://Google.ru – nabiullinas

Odpowiedz

5

Przestrzegasz wielkości liter przy użyciu flagi wbudowanej i w wyrażeniu regularnym, patrz Foundation Framework Reference, aby uzyskać więcej informacji na temat dostępnych funkcji wyprostowania.

(?ismwx-ismwx)
Ustawienia flagi. Zmień ustawienia flagi. Zmiany dotyczą części wzorca następującego po ustawieniu. Na przykład (? I) zmiany w dopasowaniu wielkości liter. Flagi są zdefiniowane w Opcjach flagi.

Dla czytelników:

Dopasowany URL wewnątrz większych tekstów jest już solvedproblem, ale w tym przypadku, simple regex jak

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

zrobi jak OP wymaga dopasuj tylko adresy URL zaczynające się od http lub https lub HTTPs itd.

+0

Nie działa - Dane wejściowe - Przetestuj internet http://google.com/hp nowy test w porządku, do widzenia Dane wyjściowe - http://google.com/hp nowy test w porządku, by – Deb

+0

Co masz na myśli? Czy możesz wysłać * widoczny * dowód, że nie działa? Chodzi o to, że 'Http: // Google.com' i' http: // google.com' powinny być dopasowane do 'http: //'. '(? i)' wyłącza rozróżnianie wielkości liter od wzorca. –

+0

Sprawdź to - http://www.rubular.com/r/onCJeLjrho – Deb

1

Spróbuj tego - 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

Nie ma absolutnie potrzeby uciekania kropki wewnątrz klasy znaków. Dlaczego warto korzystać z tak wielu grup przechwytujących? Nie korzystasz z żadnego. –

+0

Dziękuję, że skomentowałeś, ale czy sprawdziłeś przypadek testowy opublikowany przeciwko Twojemu komentarzowi? Dzięki – Deb

+0

Próbowałem go i znalazłem odpowiedź deb może dokładnie dopasować adres URL. Odpowiedź stribizheva będzie pasować od http do końca wiersza, który nie jest legalnym adresem URL. – Ripley

1

Złóż exension sznurka

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

połączeń przy użyciu jak to

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

Wystarczy utworzyć kopalnię, że działa całkiem dobrze, a jego łatwe do modyfikacji.

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 
} 

Nazwać bezpośrednio lub wewnątrz rozszerzenie String jak ten

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

I nazwij to tak

let newUrl = "www.google.com" 
let isValid = newUrl.isValid() 
Powiązane problemy