編集 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