Javaの正規表現での大文字小文字の区別について

Javaの正規表現での大文字小文字の区別について

このページでは、Javaの正規表現を使用する際に、大文字と小文字の区別をどのように制御するかについて解説します。例を交えて詳細に説明します。

デフォルトでは大文字小文字を区別する

Javaの正規表現はデフォルトで大文字と小文字を区別します。たとえば、以下のコードでは「Hello」という文字列に対して、「hello」というパターンはマッチしません。


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

public class Main {
    public static void main(String[] args) {
        String text = "Hello, World!";
        Pattern pattern = Pattern.compile("hello"); // 大文字小文字を区別
        Matcher matcher = pattern.matcher(text);
        
        if (matcher.find()) {
            System.out.println("マッチしました");
        } else {
            System.out.println("マッチしませんでした");
        }
    }
}
    

この場合、「マッチしませんでした」と表示されます。

大文字小文字を区別しないためのフラグ

大文字と小文字を区別しないようにするには、Pattern.CASE_INSENSITIVEフラグを使用します。このフラグを設定すると、「Hello」と「hello」が同一視されます。


Pattern pattern = Pattern.compile("hello", Pattern.CASE_INSENSITIVE);
    

この設定により、同じコードでも「Hello」に対してマッチするようになります。

Pattern.compileメソッドでのフラグ設定

フラグを使用する場合、Pattern.compileメソッドの第2引数に指定します。以下は例です。


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

public class Main {
    public static void main(String[] args) {
        String text = "Hello, World!";
        Pattern pattern = Pattern.compile("hello", Pattern.CASE_INSENSITIVE); // フラグを設定
        Matcher matcher = pattern.matcher(text);
        
        if (matcher.find()) {
            System.out.println("マッチしました");
        } else {
            System.out.println("マッチしませんでした");
        }
    }
}
    

この場合、「マッチしました」と表示されます。

正規表現内でのインラインフラグ

正規表現自体にインラインフラグを埋め込むこともできます。(?i)を使用すると、その後の正規表現が大文字小文字を区別しなくなります。


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

public class Main {
    public static void main(String[] args) {
        String text = "Hello, World!";
        Pattern pattern = Pattern.compile("(?i)hello"); // インラインフラグを使用
        Matcher matcher = pattern.matcher(text);
        
        if (matcher.find()) {
            System.out.println("マッチしました");
        } else {
            System.out.println("マッチしませんでした");
        }
    }
}
    

このコードでも「マッチしました」と表示されます。

実際の例

以下は、いくつかの具体例です。

  • 文字列全体に対して大文字小文字を無視してマッチング:
  • 
    String text = "Java is FUN!";
    Pattern pattern = Pattern.compile("java is fun", Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(text);
    System.out.println(matcher.find()); // true
            
  • インラインフラグと部分一致の組み合わせ:
  • 
    String text = "Welcome to Java Programming!";
    Pattern pattern = Pattern.compile("(?i)java");
    Matcher matcher = pattern.matcher(text);
    while (matcher.find()) {
        System.out.println("マッチ: " + matcher.group()); // "Java"
    }
            

ロケールに依存する場合

Pattern.CASE_INSENSITIVEはデフォルトで英語のロケールを使用します。特定のロケールに依存する大文字小文字の区別を考慮する場合、Pattern.UNICODE_CASEフラグを追加することができます。


String text = "İstanbul";
Pattern pattern = Pattern.compile("istanbul", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
Matcher matcher = pattern.matcher(text);
System.out.println(matcher.find()); // true
    

この例では、トルコ語の特殊な大文字変換にも対応します。

以上の方法を活用することで、Javaの正規表現での大文字小文字の区別を柔軟に制御することができます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です