Как вернуть совпадение с регулярным выражением, которое может повторяться многократно
Я могу только повторить результат Val один раз. Длина вызова повторяется по нему, и, следовательно, вызов result.next
вызывает исключение.
val result = for ( regex(name) <- regex findAllIn output) yield name
println(result.length)
println(result.next)
В результате получается AFAIK Iterator[String], поэтому я не уверен, почему я могу выполнить итерацию только один раз.
2 ответа
Вы можете попробовать назвать что-то вроде toVector
на нем, чтобы он сохранил его в постоянной коллекции, а затем вы можете повторять его столько раз, сколько захотите.
Iterator
только позволит вам пройти через содержимое один раз, следовательно, если вы хотите просмотреть его более одного раза, то превратите его в коллекцию. Учитывая, что у вас есть Iterator[String]
вызывая что-то вроде .toVector
на это даст вам Vector[String]
,
В результате получается AFAIK Iterator[String], поэтому я не уверен, почему я могу выполнить итерацию только один раз.
Потому что это как Iterator
с работой. Вы не можете вернуться назад или сбросить их - после того, как вы пройдете через них, они "израсходованы".
Обходной путь должен преобразовать результат, например, в List
, который не имеет таких ограничений:
val result = (for ( regex(name) <- regex findAllIn output) yield name).toList
println(result.length)
println(result.head)