パターンの中のエスケープ処理

広告

パターンを表す文字列の中には任意の文字を記述することが出来ますが、特殊な用途で使用される文字にはエスケープ処理が必要となります。

¥ * + . ? { } ( ) [ ] ^ $ - |

これらの文字はパターンの中で使用されると特別な意味を持ちます。そこで単なる文字として扱いたい場合には「¥」記号を使ってエスケープ処理を行います。例えば次のように記述します。

¥¥
¥*
¥|

"¥*"と書いた場合は特殊な意味を持たない"*"という1つの文字として扱われます。

また「-」については[]の中で使用される場合にだけ特別な意味を持つため、[]の中で使用される時にエスケープ処理が必要となります。

エスケープシーケンス

パターンを表す文字列の中には次のエスケープシーケンスも記述することができます。

¥0n     8 進値 0n を持つ文字 (0 <= n <= 7)
¥0nn    8 進値 0nn を持つ文字 (0 <= n <= 7)
¥0mnn   8 進値 0mnn を持つ文字 (0 <= m <= 3、0 <= n <= 7)
¥xhh    16 進値 0xhh を持つ文字
¥uhhhh  16 進値 0xhhhh を持つ文字
¥t      タブ文字 ('¥u0009')
¥n      改行文字 ('¥u000A')
¥r      キャリッジリターン文字 ('¥u000D')
¥f      用紙送り文字 ('¥u000C')
¥a      警告 (ベル) 文字 ('¥u0007')
¥e      エスケープ文字 ('¥u001B')
¥cx     x に対応する制御文字

他にも特別な意味を持つエスケープシーケンスが用意されていますが、必要になった時に随時解説していきます。

文字列の中に記述する場合の注意点

例えば"^"という文字に一致するパターンを作成する場合を考えてみます。"^"はパターンの中では特別な意味を持つ文字のため単なる文字として扱いたい場合は¥記号によるエスケープ処理が必要です。実際には次のように記述します。

¥^

そこで次のように記述してしまうと間違いとなります。

String regex = "¥^";
Pattern p = Pattern.compile(regex);

文字列の中で¥記号は特別な意味を持ちます。その為、今度は"¥"に対して¥記号によるエスケープ処理が必要となります。実際には次のように記述します。

String regex = "¥¥^";
Pattern p = Pattern.compile(regex);

最初のエスケープはパターンを表す文字列の記述ルールに従って行ったもので、次のエスケープはJava言語の文字列の中で¥記号を記述する場合のルールに従ったものです。"¥¥"と続けて記述されていてもそれぞれ意味が違う場合がありますので注意して下さい。

サンプルプログラム

では実際に試してみます。

JSample4_1.java

import java.util.regex.Pattern;
import java.util.regex.Matcher;

class JSample4_1{
  public static void main(String args[]){
    String str1 = "a";
    String str2 = ".";

    String regex1 = ".";
    Pattern p1 = Pattern.compile(regex1);

    String regex2 = "¥¥.";
    Pattern p2 = Pattern.compile(regex2);

    check(p1, str1);
    check(p1, str2);
    check(p2, str1);
    check(p2, str2);
  }

  private static void check(Pattern p, String target){
    Matcher m = p.matcher(target);

    System.out.print(target + " は " + p.pattern() + " に");

    if (m.find()){
      System.out.println("マッチします");
    }else{
      System.out.println("マッチしません");
    }
  }
}

ではコンパイルを行った上で実行してみます。

p4-1

今回はまず"."で表されるパターンにマッチするかどうか調べています。パターンでは"."は任意の一文字を表す特殊な文字のため、"a"でも"."でもマッチします。それに対して"¥."は"."という単なる文字を表すパターンの為、"a"にはマッチしませんが"."にはマッチします。

( Written by Tatsuo Ikura )