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

Javaの正規表現で単語文字をマッチさせる方法(\wの使い方を解説)

正規表現における「単語文字」とは、英字(大文字・小文字)、数字(0〜9)、そしてアンダースコア(_)の総称です。これらの文字にマッチさせるには、メタ文字「\w」を使用します。Javaでは「\w」は「[a-zA-Z_0-9]」と同等の意味を持ちます。

例1:先頭5文字が単語文字かどうかを判定する

次の例では、正規表現「^\w{5}」を使って、入力された文字列の先頭5文字がすべて単語文字であるかをチェックしています。「^」は文字列の先頭位置を表し、「{5}」は直前のパターンがちょうど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 = "^\\w{5}";
        // 正規表現をコンパイルしてPatternオブジェクトを生成
        Pattern pattern = Pattern.compile(regex);
        // Matcherオブジェクトを取得
        Matcher matcher = pattern.matcher(input);
        if(matcher.find()) {
            System.out.println("Match occurred");
        } else {
            System.out.println("Match not occurred");
        }
    }
}

実行結果1

Enter a String
hello
Match occurred

入力が「hello」の場合、先頭5文字がすべて英小文字であるため、マッチが発生します。

実行結果2

Enter a String
#how
Match not occurred

一方、「#how」のように記号「#」が含まれていると、単語文字以外の文字が先頭に存在するためマッチしません。

例2:文字列全体が単語文字のみで構成されているか判定する

次の例では、正規表現「\w*」を使用しています。Stringクラスのmatches()メソッドは文字列全体との完全一致を判定するため、入力値が単語文字だけから構成されている場合にのみtrueを返します。

import java.util.Scanner;

public class RegexExample {
    public static void main(String args[]) {
        // 単語文字のみを受け付ける正規表現
        String regex = "\\w*";
        System.out.println("Enter input value: ");
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        boolean bool = input.matches(regex);
        if(bool) {
            System.out.println("match occurred");
        } else {
            System.out.println("match not occurred");
        }
    }
}

実行結果

Enter input value:
*##&
match not occurred

入力が「*##&」の場合、記号が含まれているためマッチせず、「match not occurred」が出力されます。

補足:\wと\Wの違い

「\w」が単語文字にマッチするのに対し、その否定形である「\W」は単語文字以外の文字(記号や空白など)にマッチします。用途に応じて使い分けると便利です。

なお、Javaのデフォルト設定では「\w」はASCII文字のみを対象とするため、日本語などの全角Unicode文字にはマッチしません。Unicode文字も単語文字として扱いたい場合は、Pattern.compile()の第2引数に「Pattern.UNICODE_CHARACTER_CLASS」フラグを指定するか、「\p{L}」のようなUnicodeプロパティを利用したパターンを検討してください。

  1. Java正規表現(Regex)で固定文字セットにマッチさせる方法

    Javaの正規表現における文字クラスを使うと、あらかじめ定義しておいた固定の文字集合の中から「任意の1文字」にマッチさせることができます。たとえば、次のように記述します。 [tmp]:t、m、p のいずれか1文字にマッチします。 [^tp]:t と p 以外の任意の1文字にマッチします(先頭に ^ を付けると否定を意味します)。 角括弧 [ ] 内に候補となる文字を列挙すると、入力文字列の各位置についてその中のどれか1つが存在すればマッチが成立します。この仕組みを利用すると、「特定の文字が文字列内に何回出現するか」を簡単に数えることができます。 例1:指定した文字の出現回数をカウントする

  2. Java正規表現(RegEx)で任意の文字にマッチさせる方法

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