Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaの正規表現で大文字・小文字を区別せずに文字列をマッチさせる方法

Javaで正規表現を使って文字列を検索する際、デフォルトでは大文字と小文字が厳密に区別されます。しかし、Patternクラスのcompile()メソッドにフラグを指定することで、大文字・小文字を区別せずにマッチさせることが可能です。

Pattern.compile()メソッドのパラメータ

Patternクラスのcompile()メソッドは、次の2つの引数を受け取ります。

  • 正規表現を表す文字列値
  • マッチングの動作を制御するPatternクラスの整数型フィールド(フラグ)

CASE_INSENSITIVEフラグとは

Pattern.CASE_INSENSITIVEは、大文字と小文字の違いを無視して文字をマッチさせるためのフィールドです。このフラグをcompile()メソッドの第2引数として渡すと、正規表現は大文字・小文字のどちらの表記にも一致するようになります。

Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);

例1: 大文字小文字を区別せずに出現回数をカウントする

次の例では、入力された文字列の中から「test」という単語を、大文字・小文字を問わず検索し、その出現回数をカウントしています。

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

public class Example {
   public static void main(String args[]) {
      Scanner sc = new Scanner(System.in);
      System.out.println("Enter input data: ");
      String input = sc.nextLine();
      // 検索対象の文字列に対応する正規表現
      String regex = "test";
      // 正規表現をコンパイル(大文字小文字を区別しない)
      Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
      // Matcherオブジェクトを取得
      Matcher matcher = pattern.matcher(input);
      int count = 0;
      while (matcher.find()) {
         count++;
      }
      System.out.println("Number of occurrences: " + count);
   }
}

実行結果

Enter input data:
test TEST Test sample data
Number of occurrences: 3

「test」「TEST」「Test」という異なる表記の3つの単語すべてがカウントされていることがわかります。

例2: 文字列がboolean型かどうかを判定する

次の例では、true|falseという正規表現にCASE_INSENSITIVEフラグを組み合わせることで、「TRUE」や「False」など、どのような大文字・小文字の組み合わせでも判定できるようになっています。

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

public class VerifyBoolean {
   public static void main(String args[]) {
      Scanner sc = new Scanner(System.in);
      System.out.println("Enter a string value: ");
      String str = sc.next();
      // true または false に大文字小文字を区別せずマッチ
      Pattern pattern = Pattern.compile("true|false", Pattern.CASE_INSENSITIVE);
      Matcher matcher = pattern.matcher(str);
      if (matcher.matches()) {
         System.out.println("Given string is a boolean type");
      } else {
         System.out.println("Given string is not a boolean type");
      }
   }
}

実行結果

Enter a string value:
TRUE
Given string is a boolean type

補足: インラインフラグによる指定方法

compile()メソッドにフラグを渡す代わりに、正規表現の中にインラインフラグ(?i)を埋め込むことでも同じ効果が得られます。

Pattern pattern = Pattern.compile("(?i)test");

この方法なら、パターンの一部だけに大文字小文字の区別を無効化したい場合など、より柔軟な制御が可能です。

まとめ

  • Pattern.compile()の第2引数にPattern.CASE_INSENSITIVEを指定すると、大文字・小文字を区別せずにマッチできる。
  • 正規表現内に(?i)を記述するインラインフラグの方法もある。
  • ユーザー入力のバリデーションやキーワード検索など、表記ゆれを許容したい場面で特に有用。
  1. Java正規表現(RegEx)で任意の文字にマッチさせる方法

    Javaの正規表現におけるメタ文字「.」(ドット)は、任意の1文字にマッチします。マッチ対象はアルファベットでも数字でも、記号などの特殊文字でも構いません。メタ文字「.」の基本「.」は改行文字以外のあらゆる単一文字と一致するため、パターンの柔軟性を高めたい場面で非常に便利です。なお、ドットそのもの(リテラルの「.」)にマッチさせたい場合は、バックスラッシュでエスケープして「\.」と記述します。例1:任意の1文字とのマッチ次のプログラムでは、ユーザーから入力された文字列に対して正規表現「.」を適用し、文字数をカウントしています。import java.util.Scanner; import j

  2. Javaの正規表現を使って文字列からHTMLタグを抽出する方法

    Javaのjava.util.regexパッケージには、文字シーケンスの中から特定のパターンを検索するためのさまざまなクラスが用意されています。 このパッケージのPatternクラスは、正規表現をコンパイルした結果を表すクラスです。文字列と正規表現のマッチングを行うために、次の2つのメソッドが提供されています。 compile() − 正規表現を表す文字列を引数として受け取り、Patternクラスのオブジェクトを返します。 matcher() − 対象となる文字列を受け取り、その文字列を現在のPatternオブジェクトが表すパターンと照合するためのMatcherオブジェクトを生成します。