正規表現いろいろ ( 自分用メモ )

ちょっと正規表現をゴニョゴニョさわってみたので、パッと取り出せるメモ的な意味で残しておきます。あくまで自分用メモという感じです。正規表現は Web にたくさん詳しい情報があるので、ちゃんと調べたい方はそちらの情報を見てもらった方がいいと思います。


.:任意の文字にマッチ
*:ひとつ前の文字 0 回以上にマッチ

なので、「.*」としてやると全ての文字列にマッチするはずです。以下のコードだと s2 は何がきても true になるはず。

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

public class Test {
  public static void main(String[] args) {
    String s1 = ".*";
    String s2[] = { "なんでも true になるはず", "hogehoge!!" };

    System.out.println(Arrays.toString(Test.test(s1, s2)));
  }

  private static boolean[] test(String s1, String s2[]) {
    boolean result[] = new boolean[s2.length];
    Pattern p = Pattern.compile(s1);
    for (int i = 0; i < s2.length; i++) {
      Matcher m = p.matcher(s2[i]);
      result[i] = m.matches();
    }
    return result;
  }
}


. 自体にマッチさせたい場合は、\ でエスケープする。

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

public class Test {
  public static void main(String[] args) {
    String s1 = "\\.";
    String s2[] = { ".", "a" };

    System.out.println(Arrays.toString(Test.test(s1, s2)));
  }

  private static boolean[] test(String s1, String s2[]) {
    boolean result[] = new boolean[s2.length];
    Pattern p = Pattern.compile(s1);
    for (int i = 0; i < s2.length; i++) {
      Matcher m = p.matcher(s2[i]);
      result[i] = m.matches();
    }
    return result;
  }
}


"0 回以上" 以外としては、例えば、以下ように ? やら + なんかがある。

?:ひとつ前の文字 0、または、1 回にマッチ
+:ひとつ前の文字 1 回以上にマッチ
{n}:ひとつ前の文字 n 回にマッチ


[]:カッコ内の一字にマッチ ( ^ と組み合わせて [^] とすると一字以外にマッチ )

a か b か c にマッチは [abc] とか - 使って [a-c] と書ける。a、b、c 以外は [^abc] となる。

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

public class Test {
  public static void main(String[] args) {
    String s1 = "z[abc]z";
    //String s1 = "z[a-c]z";
    //String s1 = "z[^abc]z"; //result は [false, false, false, true] となる
    String s2[] = { "zaz", "zbz", "zcz", "zdz" };

    System.out.println(Arrays.toString(Test.test(s1, s2)));
  }

  private static boolean[] test(String s1, String s2[]) {
    boolean result[] = new boolean[s2.length];
    Pattern p = Pattern.compile(s1);
    for (int i = 0; i < s2.length; i++) {
      Matcher m = p.matcher(s2[i]);
      result[i] = m.matches();
    }
    return result;
  }
}


^:行頭にマッチ
$:行末にマッチ

a で始まって、z で終わる文字列だと ^a.*z$ と書ける。

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

public class Test {
  public static void main(String[] args) {
    String s1 = "^a.*z$";
    String s2[] = { "az", "abbbz", "abzz", "azb", "baz" };

    System.out.println(Arrays.toString(Test.test(s1, s2)));
  }

  private static boolean[] test(String s1, String s2[]) {
    boolean result[] = new boolean[s2.length];
    Pattern p = Pattern.compile(s1);
    for (int i = 0; i < s2.length; i++) {
      Matcher m = p.matcher(s2[i]);
      result[i] = m.matches();
    }
    return result;
  }
}


まぁ、普通に Pattern クラスの API ドキュメント見ればええやんという内容ですね・・・

・Pattern (Java Platform SE 8 )
https://docs.oracle.com/javase/jp/8/api/java/util/regex/Pattern.html

・Matcher (Java Platform SE 8 )
https://docs.oracle.com/javase/jp/8/api/java/util/regex/Matcher.html

[ 環境情報 ]
Windows 7 SP1
Java SE 8 Update 25