4

編集 1: @GoodDokval 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

機能しないもの:

このコードは、文字列内の複数の一致を見つけるために使用され、1 年以上機能しましたが、最近、名前付きのキャプチャ グループにアクセスすると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