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

Javaの正規表現における「[^...]」(否定文字クラス)の使い方

Javaの正規表現における部分式(メタ文字)「[^...]」は、括弧内に含まれていない任意の1文字にマッチする否定文字クラスです。通常の文字クラス「[...]」が括弧内のいずれかの文字にマッチするのに対し、先頭に「^」を付けることで意味が反転し、指定した文字以外にマッチします。

例1:特定の文字以外の出現回数をカウントする

次の例では、「h」「w」「t」「y」「o」「u」「p」「i」以外の文字が入力文字列にいくつ含まれているかを数えています。

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

public class SpecifiedCharacters {
    public static void main(String args[]) {
        String regex = "[^hwtyoupi]";
        String input = "Hi how are you welcome to Tutorialspoint";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(input);
        int count = 0;
        while (m.find()) {
            count++;
        }
        System.out.println("マッチ数: " + count);
    }
}

実行結果

マッチ数: 21

このように、「[^hwtyoupi]」はリスト外のすべての文字(スペースや大文字の「H」なども含む)を1文字ずつカウントします。

例2:英字を含まない文字列を抽出する

次のJavaプログラムは、ユーザーから5つの文字列を受け取り、その中から英字(a〜z、A〜Z)を一切含まない文字列だけを出力します。

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

public class RegexExample {
    public static void main(String args[]) {
        String regex = "^.*[^a-zA-Z].*$";
        Scanner sc = new Scanner(System.in);
        System.out.println("5つの文字列を入力してください:");
        String input[] = new String[5];
        for (int i = 0; i < 5; i++) {
            input[i] = sc.nextLine();
        }
        // Patternオブジェクトの生成
        Pattern p = Pattern.compile(regex);
        System.out.println("英字を含まない文字列:");
        for (int i = 0; i < 5; i++) {
            // Matcherオブジェクトの生成
            Matcher m = p.matcher(input[i]);
            if (m.find()) {
                System.out.println(m.group());
            }
        }
    }
}

実行結果

5つの文字列を入力してください:
1234*5
*&%
sample
test
data23
英字を含まない文字列:
1234*5
*&%

ここで使用している正規表現「^.*[^a-zA-Z].*$」は、「行全体の中に少なくとも1つ、英字以外の文字が含まれる」という条件を表しています。「sample」「test」のように英字のみで構成された文字列はマッチせず、「1234*5」や「*&%」のような数字・記号を含む文字列だけが出力されます。

ポイントまとめ

  • 「[abc]」→ a、b、c のいずれか1文字にマッチ
  • 「[^abc]」→ a、b、c 以外の任意の1文字にマッチ
  • 「^」は文字クラスの先頭にある場合のみ否定の意味になり、それ以外の場所では行頭を表すアンカーとして機能する
  • 範囲指定(例:「[^a-zA-Z0-9]」)と組み合わせることで、特定の種類の文字を除外できる
  1. Javaの正規表現「re*」メタ文字とは?使い方とサンプルコード解説

    Javaの正規表現におけるメタ文字「re*」(量指定子 *)は、直前の表現・部分式の0回以上の繰り返しにマッチします。つまり、直前の要素が1回も出現しない場合でもマッチ対象となる点が特徴です。 re*の基本的な動作 例えば、正規表現 aabc* の場合は、「aab」の後に「c」が0回以上続く文字列にマッチします。したがって、「aab」「aabc」「aabcc」など、いずれもマッチ対象になります。 例1:パターンに一致する件数を数える import java.util.regex.Matcher; import java.util.regex.Pattern; public class Re

  2. Java正規表現のメタ文字「.(ドット)」の使い方を徹底解説

    Javaの正規表現におけるメタ文字「.(ドット)」は、改行文字を除く任意の1文字にマッチする特殊な記号です。この記事では、ドットメタ文字の基本的な動作と、実際のコード例を使った具体的な使い方をわかりやすく解説します。 ドット(.)メタ文字の基本 正規表現のサブ式である「.」は、改行(\n)以外のあらゆる単一文字に一致します。英字・数字・記号・空白など、種類を問わず1文字としてカウントされるため、パターンの柔軟な指定に非常に便利です。 例1:任意の1文字とのマッチ数を数える 次のJavaプログラムでは、パターン「.」を使って入力文字列内の各文字がいくつマッチするかをカウントしています。空白も1文