Regex の replaceAllIn で出るIllegal group reference エラーについて
こんにちは、 @kz_morita です。
Scala (Java) で正規表現クラスを使っている際に遭遇したエラーについてまとめます。
Illegal group reference エラーについて Scala で以下のような正規表現を使用するコードを書いていました。
import scala.util.matching.Regex val regex = "【(.*)】".r val replacer = (m: Regex.Match) => "(" + m.group(1) +")" regex.replaceAllIn("hogehoge【fuga】", replacer) // hogehoge(fuga) 【】 を() に変換するといったようなコードです。
上記は正常に動くのですが、以下のようなテキストは正常に動きません。
regex.replaceAllIn("hoge【$abcde】", replacer) 上記は、以下のような Illegal group reference エラーが出ます。
java.lang.IllegalArgumentException: Illegal group reference at java.base/java.util.regex.Matcher.appendExpandedReplacement(Matcher.java:1067) at java.base/java.util.regex.Matcher.appendReplacement(Matcher.java:907) at scala.util.matching.Regex$Replacement.replace(Regex.scala:898) at scala.util.matching.Regex$Replacement.replace$(Regex.scala:898) at scala.util.matching.Regex$MatchIterator$$anon$4.replace(Regex.scala:876) at scala.util.matching.Regex.$anonfun$replaceAllIn$1(Regex.scala:512) ... エラーの原因 "【(.*)】".r という正規表現で 【】 の中身の文字列をキャプチャするのですが、その中に、$ 記号がある場合にそれを正規表現の置換対象とみなしてしまうようです。
どういうことかというと、hoge【$abcde】 というテキストだと、【】の中の $abcde というテキストが、マッチしますがその中の $a という部分が後方参照で置換する対象だと解釈してしまいます。 しかし $a というのは、参照できないため Illegal group reference エラーになります。