Хорошо, прежде всего, поймите, что findAllIn
возвращает Iterator
. Iterator
является изменяемым объектом, который используется один раз. ВСЕ, что вы делаете с ним, изменит это. Читайте об итераторах, если вы не знакомы с ними. Если вы хотите, чтобы его можно было использовать повторно, преобразуйте результат findAllIn в List
и используйте только этот список.
Теперь, кажется, вы хотите все соответствующие группы , а не все совпадения. Метод findAllIn
вернет все совпадения регулярного выражения full , которые можно найти в строке. Например:
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
Обратите внимание, что есть два совпадения, и ни одно из них не содержит "," в середине строки, поскольку это не является частью какого-либо совпадения.
Если вы хотите группы, вы можете получить их так:
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)
Или, используя findAllIn
, вот так:
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
Метод matchData
создаст Iterator
, который возвращает Match
вместо String
.