4

编辑 1:@GoodDok 我不能使用val regex = """(\d+) (\S+)""".r("Id", "Name"),因为正则表达式模式和匹配的字符串是由用户提供的。组数和命名每次都是自定义的。

编辑 2:@Wiktor Stribiżew 这个问题与Scala regex Named Capturing Groups不同。在这里,您可以清楚地看到命名捕获组在 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
4

0 回答 0