2014年1月16日木曜日

Javaの正規表現で後方参照ができることを知らなかった。。。

Javaの正規表現で後方参照ができることを知らなかった。。。

ずっと、なんででけへんのかなーと思っていたのですが(なぜ?)できるのですね!後方参照!

知らないおかげで変なロジックを色んな所に置いてきたかと思うと我ながら恐ろしくなります。。。(笑。。。えない)

Javaでの後方参照はだいたいこんな感じのようです。

  • ()で囲まれた部分を対象とする
  • $1’ などの ‘$数字’ を参照とする
  • ‘$0’ は正規表現全体にマッチした文字列を表す
  • $1などを指定したのに該当の()がない場合は java.lang.IndexOutOfBoundsException が発生する

以下に例を載せておきます。

String target = "abcd";

System.out.println(target.replaceAll("abc(d)", "$1abc: $0"));
// => "dabc: abcd"

System.out.println(target.replaceAll("abc(x)", "$1abc: $0"));
// => "abcd"

System.out.println(target.replaceAll("ab(c)(d)", "$1$2ab: $0"));
// => "cdab: abcd"

System.out.println(target.replaceAll("a", "$0x: $0"));
// => "ax: abcd"
// 補足: a → ax: a に置換された

System.out.println(target.replaceAll("abcd", "$0x: $0"));
// => "abcdx: abcd"
// 補足: abcd → abcdx: abcd に置換された

System.out.println(target.replaceAll("vxyz", "$0x: $0"));
// => "abcd"
// 補足: 置換対象なし

System.out.println(target.replaceAll("vxyz", "$1x: $0"));
// => "abcd"
// 補足: 置換対象なし

System.out.println(target.replaceAll("abcd", "$1abc: $0"));
// => java.lang.IndexOutOfBoundsException: group 1

System.out.println(target.replaceAll("abc(d)", "$1$2abc: $0"));
// => java.lang.IndexOutOfBoundsException: group 2

Written with StackEdit.

  • この記事をシェアする

  • このエントリーをはてなブックマークに追加
  • このブログの更新をチェックする

  • follow us in feedly