任意の一文字(.)

広告

メタ文字の1つであるドット"."をパターンの中に記述すると行末記号を除く任意の一文字にマッチします。

書式は次の通りです。

"."
メタ文字の"."は繰り返しではなく文字クラスの一つですが、説明の都合上ここに記載しています。

使用例としては次のようになります。

"ab.cd"

上記の場合、ドット(.)は任意の一文字にマッチしますので"abfcd"や"ab0cd"などドット(.)が記述された位置にどんな文字(行末記号は除く)が書かれている場合もマッチすることになります。(行末記号については「行末記号」を参照して下さい)。

注意する点としては任意の一文字ですので必ず一文字必要です。よって"abcd"のように"ab"と"cd"の間に文字が存在しないものや、「abeecd」のように「ab」と「cd」の間に2つ以上の文字が含まれる場合はマッチしません。

○ abhcd
○ ab4cd
○ ab#cd
× abcd
× abppcd

"."はパターン内で何回でも使用することが出来ますので次のように記述することもできます。

"ab..cd"

上記の場合は"ab"と"cd"の間に任意の二文字がある文字列にマッチします。(例:abomcdd)。

"a.b.c.d"

上記の場合は"a","b","c","d"の各文字の間に1つずつ任意の文字がある文字列にマッチします。(例:a1b2c3d)。

具体的には次のように記述します。

String str = "abcd";
String regex = "a.c";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);

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

上記の場合はマッチします。

DOTALLモード

デフォルトでは"."は行末記号にマッチしませんが、DOTALLモードを有効にすると"."は行末記号にもマッチするようになります。

具体的な例で考えてみます。パターンを"b.c"とした場合、デフォルトでは"ab¥ncd"にはマッチしませんが、DOTALLモードを有効にするとマッチするようになります。

デフォルトの状態:
× ab¥ncd

DOTALLモード有効:
○ ab¥ncd

具体的には次のように記述します。

String str = "ab¥ncd";
String regex = "b.c";
Pattern p = Pattern.compile(regex, Pattern.DOTALL);
Matcher m = p.matcher(str);

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

サンプルプログラム

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

JSample1_1.java

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

class JSample1_1{
  public static void main(String args[]){
    String str1 = "abcd";
    String str2 = "abMcd";
    String str3 = "abKMcd";
    String str4 = "ab¥ncd";

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

    String regex2 = "b.c";
    Pattern p2 = Pattern.compile(regex2, Pattern.DOTALL);

    System.out.println("パターン : " + regex1);

    check(p1, str1);
    check(p1, str2);
    check(p1, str3);
    check(p1, str4);

    System.out.println("¥nDOTALLモードに変更¥n");
    System.out.println("パターン : " + regex2);

    check(p2, str1);
    check(p2, str2);
    check(p2, str3);
    check(p2, str4);
  }

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

    if (m.find()){
      System.out.println("○ " + target);
    }else{
      System.out.println("× " + target);
    }
  }
}

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

p1-1

デフォルトのままですと"."は行末記号にマッチしませんが、DOTALLモードを有効にすると行末記号にもマッチしていることが確認できます。

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)