2016-09-02 2 views
3

Ich versuche, ein String für regex mit dem folgenden Code-Schnipsel (es ist in einer Erweiterung für String) zu suchen:ein Range Aktualisieren in Swift 3

var range = self.startIndex..<self.endIndex 

    while range.lowerBound < range.upperBound { 

     if let match = self.range(of: regex, options: .regularExpression, range: range, locale: nil) { 

      print(match) 
      range = ?????  <============ this line, how do I update the range? 
     } 
    } 

Es wird richtig das erste Vorkommen finden, aber dann habe ich Ich weiß nicht, wie ich den Bereich auf die Position der Übereinstimmung einstellen soll, um den Rest der Zeichenfolge zu suchen.

+1

Was versuchen Sie innerhalb dieser 'while' Schleife zu tun? Scheint wie eine Endlosschleife, auch wenn Sie den Bereich aktualisieren können. Und ich denke' NSRegularExpression' ist viel sauberer –

+0

Punkt gut gemacht , irgendwelche Vorschläge, wie diese Schleife funktioniert? Ich werde auch 'NSRegularExpression' betrachten. – Koen

+0

@MartinR: Ich endete mit 'NSRegularExpression'. – Koen

Antwort

4

lowerBound und upperBound sind unveränderlich Eigenschaften des Bereichs, so müssen Sie einen neuen Bereich erstellen, bei match.upperBound starten.

Auch die Schleife sollte beendet werden, wenn keine Übereinstimmung gefunden wird. Dies kann erreicht werden, indem die Bindung let match = ... in den Zustand versetzt wird.

var range = self.startIndex..<self.endIndex 
    while range.lowerBound < range.upperBound, 
     let match = self.range(of: regex, options: .regularExpression, range: range) { 
      print(match) // the matching range 
      print(self.substring(with: match)) // the matched string 

      range = match.upperBound..<self.endIndex 
    } 

Dies kann immer noch zu einer Endlosschleife führen, wenn ein leerer String dem Muster übereinstimmt (zB für regex = "^"). Dies kann gelöst werden, aber als Alternative, NSRegularExpression verwenden, um eine Liste aller Spiele zu bekommen ((zB Swift extract regex matches)