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

Java正規表現で文字の範囲をマッチさせる方法【文字クラスの使い方を解説】

文字クラスで文字の範囲をマッチさせる基本

正規表現において、ある文字から別の文字までの範囲に含まれるすべての文字(文字の範囲)をマッチさせたい場合は、文字クラスを使用します。文字クラスは、角括弧 [] の中にハイフン - で始点と終点をつなげて記述します。

[a-z]
  • [a-zA-Z]」…… すべての英字(大文字・小文字のアルファベット)1文字にマッチします。

  • [0-9&&[^35]]」…… 3と5を除くすべての数字にマッチします。&& は文字クラス同士の共通部分(積集合)を表すJava独自の記法です。

なお、&& を使った文字クラスの共通部分演算はJavaの正規表現に固有の機能であり、他の多くの言語では利用できない点に注意してください。

例1:英数字のみで構成された文字列かどうかを判定する

次のサンプルでは、ユーザーが入力した文字列が「英字と数字のみ」で構成されているかどうかを、正規表現 ^[a-zA-Z0-9]*$ を使って判定します。

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 a String");
      Scanner sc = new Scanner(System.in);
      String input = sc.nextLine();
      String regex = "^[a-zA-Z0-9]*$";
      // 正規表現をコンパイルしてPatternオブジェクトを生成
      Pattern pattern = Pattern.compile(regex);
      // Matcherオブジェクトを取得
      Matcher matcher = pattern.matcher(input);
      if(matcher.matches()) {
         System.out.println("Match occurred");
      } else {
         System.out.println("Match not occurred");
      }
   }
}

実行結果1(英数字のみの場合)

Enter a String
Hello
Match occurred

入力「Hello」は英字のみで構成されているため、パターンにマッチし「Match occurred」と表示されます。

実行結果2(記号を含む場合)

Enter a String
sample#
Match not occurred

入力「sample#」には記号「#」が含まれているため、パターンにマッチせず「Match not occurred」と表示されます。

例2:特定の数字を除いた出現回数をカウントする

次のサンプルでは、文字クラス [0-9&&[^35]] を使って、入力文字列の中に「3と5以外の数字」が何回出現するかをカウントします。

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 a String");
      Scanner sc = new Scanner(System.in);
      String input = sc.nextLine();
      String regex = "[0-9&&[^35]]";
      // 正規表現をコンパイルしてPatternオブジェクトを生成
      Pattern pattern = Pattern.compile(regex);
      // Matcherオブジェクトを取得
      Matcher matcher = pattern.matcher(input);
      int count = 0;
      while(matcher.find()) {
         count++;
      }
      System.out.println("Occurrences :" + count);
   }
}

実行結果

Enter a String
111223333555689
Occurrences :8

入力「111223333555689」には合計15個の数字が含まれていますが、このうち3が4個、5が3個あります。それらを除外すると残りは8個となるため、「Occurrences :8」と表示されます。

まとめ

  • 文字の範囲をマッチさせるには、[a-z] のような文字クラスを使用する。
  • [a-zA-Z] ですべての英字に、[0-9] ですべての数字にマッチできる。
  • Javaでは && と否定 [^...] を組み合わせることで、「特定の文字を除く範囲」を柔軟に表現できる。
  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オブジェクトを生成します。