Как вернуть совпадение с регулярным выражением, которое может повторяться многократно

Я могу только повторить результат 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)
Другие вопросы по тегам