【Java】正規表現のメタ文字をリテラル文字として照合する方法(Pattern.LITERAL)
Patternクラスのcompile()メソッドとは
JavaのPatternクラスが提供するcompile()メソッドは、次の2つの引数を受け取ります。
- 正規表現を表す文字列値
- Patternクラスのフィールド(int型のフラグ値)
LITERALフラグの役割
Pattern.LITERALは、パターンをリテラル(文字通り)として解析するためのフラグです。このフラグを有効にすると、正規表現のメタ文字やエスケープシーケンスは特別な意味を持たなくなり、すべて通常の文字として扱われます。
そのため、正規表現のメタ文字を普通の文字としてそのままマッチさせたい場合は、compile()メソッドの第2引数にこのフラグを渡します。
サンプルコード
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
System.out.println("Enter input data: ");
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
String regex = "^[0-9]";
// Patternオブジェクトの生成
Pattern pattern = Pattern.compile(regex, Pattern.LITERAL);
// Matcherオブジェクトの生成
Matcher matcher = pattern.matcher(input);
int count = 0;
while(matcher.find()) {
count++;
System.out.println(matcher.group());
}
System.out.println("Number of matches: "+count);
}
}実行結果1:通常の数値を入力した場合
入力が「9848022338」の場合、^[0-9]というパターンはリテラル文字列として扱われるため、入力データ内には存在せず、一致件数は0件となります。
Enter input data: 9848022338 Number of matches: 0
実行結果2:メタ文字そのものを入力した場合
入力が「^[0-9]」という文字列そのものである場合、パターンと完全に一致するため、1件の一致が検出されます。これはLITERALフラグによって^や[]が正規表現の構文としてではなく、単なる文字として解釈されているためです。
Enter input data: ^[0-9] ^[0-9] Number of matches: 1
補足:他のフラグとの組み合わせ
Pattern.LITERALは、ビット演算子|を使って他のフラグと組み合わせることもできます。例えば、大文字小文字を区別せずにリテラル照合したい場合は、Pattern.CASE_INSENSITIVE | Pattern.LITERALのように指定します。
また、特定の文字列だけをリテラルとして扱いたい場合は、Pattern.quote(String)メソッドを使う方法もあります。こちらは文字列全体を\Qと\Eで囲み、メタ文字を無効化してくれます。
-
Javaの正規表現でMM/DD/YYYY形式の日付を検証する方法
Java の java.util.regex パッケージには、文字シーケンスの中から特定のパターンを見つけ出すためのさまざまなクラスが用意されています。 このパッケージの中心となる Pattern クラスは、正規表現をコンパイルした結果を表すクラスです。文字列と正規表現のマッチングを行う際には、主に次の2つのメソッドを使用します。 compile() — 正規表現を表す文字列を受け取り、コンパイル済みの Pattern オブジェクトを返します。 matcher() — 検証対象の文字列を受け取り、現在の Pattern オブジェクトが表すパターンと照合するための Matcher オブジェクト
-
Javaの正規表現を使って文字列からHTMLタグを抽出する方法
Javaのjava.util.regexパッケージには、文字シーケンスの中から特定のパターンを検索するためのさまざまなクラスが用意されています。 このパッケージのPatternクラスは、正規表現をコンパイルした結果を表すクラスです。文字列と正規表現のマッチングを行うために、次の2つのメソッドが提供されています。 compile() − 正規表現を表す文字列を引数として受け取り、Patternクラスのオブジェクトを返します。 matcher() − 対象となる文字列を受け取り、その文字列を現在のPatternオブジェクトが表すパターンと照合するためのMatcherオブジェクトを生成します。