Regex с именем группы захвата выдает исключение IllegalStateException в Scala

Изменить 1: @GoodDok Я не могу использовать val regex = """(\d+) (\S+)""".r("Id", "Name"), потому что шаблон регулярного выражения и соответствующая строка предоставляются пользователем. Количество групп и именование каждый раз настраиваются.

Изменить 2: @Wiktor Stribiżew Вопрос отличается от Именованные группы захвата регулярного выражения Scala. Здесь вы можете ясно видеть, что Именованные группы захвата работают в Scala, но только в специальных обстоятельства. Рабочий пример:

val regex = """(?<Id>\d+) (?<Name>\S+)""".r
val sequence = regex.findAllMatchIn("10 admin\n11 guest").toSeq

// `sequence.length` breaks the underlying Match object
//println(sequence.length)

val mached = sequence.head
println(mached.group(2)) // works fine
println(mached.group("Name")) // also works when`sequence.length` wasn't executed

Что не работает:

Этот код использовался для поиска нескольких совпадений в строке, он работал более года, но недавно при доступе к именованным группам захвата он начал бросать java.lang.IllegalStateException: No match found.

val regex = """(?<Id>\d+) (?<Name>\S+)""".r
val sequence = regex.findAllMatchIn("10 admin\n11 guest").toSeq

// `sequence.length` breaks the underlying Match object
println(sequence.length)

val mached = sequence.head
println(mached.group(2)) // works fine
println(mached.group("Name")) // throws `java.lang.IllegalStateException: No match found` if `sequence.length` was executed

Когда sequence.length удаляется, он работает нормально, поэтому кажется, что получение количества совпадений каким-то образом нарушает объекты Match.

То же самое происходит, когда я пытаюсь использовать список вместо последовательности.

val matchList = sequence.toList
println(matchList.head.group("Id")) // throws `java.lang.IllegalStateException: No match found`

Является ли незаконным или неопределенным проверять количество совпадений, а затем использовать их? Что могло быть причиной исключения и изменения поведения?

Я не помню, как недавно обновлял java, моя среда:

~ java -version
openjdk version "11.0.4" 2019-07-16
OpenJDK Runtime Environment (build 11.0.4+11-post-Ubuntu-1ubuntu218.04.3)
OpenJDK 64-Bit Server VM (build 11.0.4+11-post-Ubuntu-1ubuntu218.04.3, mixed mode, sharing
~ uname -r
4.15.0-58-generic

person Krzysztof Piekutowski    schedule 30.08.2019    source источник
comment
Попробуйте так: val regex = """(\d+) (\S+)""".r("Id", "Name")   -  person GoodDok    schedule 30.08.2019
comment
@Wiktor Stribiżew Я не считаю это дубликатом, этот вопрос, похоже, касается именованных групп захвата, которые вообще не работают при вызове методов API в определенном порядке, но связанный 7-й вопрос касается ошибки при использовании именованных групп захвата с заглядыванием назад   -  person tlegutko    schedule 30.08.2019
comment
Код не работает., Это обман stackoverflow.com/questions/3029657/   -  person Wiktor Stribiżew    schedule 30.08.2019
comment
@ WiktorStribiżew Здесь работает scastie.scala-lang.org/vC7Y8NCmQaSZdHgA с scastie.scala-lang.org/vC7Y8NCmQaSZdHgA. В вашем примере используется scala 2.11.7, поэтому кажется, что он несовместим между версиями.   -  person Krzysztof Piekutowski    schedule 30.08.2019
comment
Но это не работает с 2.13.0, так что, возможно, в 2.12.8 была какая-то ошибка.   -  person Wiktor Stribiżew    schedule 30.08.2019
comment
Итак, вы говорите, что именованные группы работают в 2.12.8, это ошибка, и что они больше не работают в 2.13? Я бы сказал, что все наоборот, это регресс, согласны?   -  person Krzysztof Piekutowski    schedule 30.08.2019
comment
Привет, у меня такая же проблема. Вы нашли решение? @KrzysztofPiekutowski   -  person Sathyamoorthy R    schedule 03.05.2021
comment
@SathyamoorthyR scala regex - это ошибочная оболочка над java regex. Я проигнорировал оболочку scala и использовал исходный java API.   -  person Krzysztof Piekutowski    schedule 06.05.2021