Изменить 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
val regex = """(\d+) (\S+)""".r("Id", "Name")
- person GoodDok   schedule 30.08.2019