Ok, zuerst ist es wichtig zu verstehen, dass findAllIn
ein Iterator
zurückgibt. Ein Iterator
ist ein einmal konsumierbares, veränderliches Objekt. ALLES, was du damit machst, wird es verändern. Informiere dich über Iterators, wenn du nicht vertraut mit ihnen bist. Wenn du möchtest, dass es wiederverwendbar ist, dann konvertiere das Ergebnis von findAllIn in eine List
und benutze nur diese List.
Jetzt scheint es, dass du alle übereinstimmenden Gruppen möchtest, nicht alle Treffer. Die Methode findAllIn
wird alle Treffer des vollen Regex zurückgeben, die im String gefunden werden können. Zum Beispiel:
scala> val s = """6 1 2, 4 1 3"""
s: java.lang.String = 6 1 2, 4 1 3
scala> val re = """(\d+)\s(\d+)\s(\d+)""".r
re: scala.util.matching.Regex = (\d+)\s(\d+)\s(\d+)
scala> for(m <- re.findAllIn(s)) println(m)
6 1 2
4 1 3
Siehst du, dass es zwei Treffer gibt und keiner von ihnen das ", " in der Mitte des Strings enthält, da es kein Teil eines Treffers ist.
Wenn du die Gruppen haben möchtest, kannst du sie so erhalten:
scala> val s = """6 1 2"""
s: java.lang.String = 6 1 2
scala> re.findFirstMatchIn(s)
res4: Option[scala.util.matching.Regex.Match] = Some(6 1 2)
scala> res4.get.subgroups
res5: List[String] = List(6, 1, 2)
Oder, indem du findAllIn
verwendest, so:
scala> val s = """6 1 2"""
s: java.lang.String = 6 1 2
scala> for(m <- re.findAllIn(s).matchData; e <- m.subgroups) println(e)
6
1
2
Die Methode matchData
wird einen Iterator
erzeugen, der Match
anstatt von String
zurückgibt.
0 Stimmen
Dein Aufruf von findAllIn(s) stimmt mit der gesamten Zeichenfolge überein, so dass deine resultierende Liste nicht List(6 1 2) ist, sondern wirklich List("6 1 2") der Länge 1