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

Java正規表現を使って文字列が英字(アルファベット)のみかどうかを判定する方法

Javaでユーザー入力された名前や文字列が、英字(アルファベットの大文字・小文字)だけで構成されているかどうかを確認したい場面はよくあります。そんなときに役立つのが正規表現です。

与えられた入力文字列から英字だけをマッチング(検証)するための正規表現は以下のとおりです。

"^[a-zA-Z]*$"

正規表現の構成要素

このパターンは、次の要素で構成されています。

  • ^ … 文字列の先頭にマッチします。
  • [a-zA-Z] … 小文字のa〜zと大文字のA〜Z、つまり英字1文字にマッチします。
  • * … 直前の文字(ここでは英字)が0回以上繰り返されることを意味します。
  • $ … 文字列の末尾にマッチします。

つまり「^[a-zA-Z]*$」は、「先頭から末尾まで英字のみで構成されている文字列」であるかどうかをチェックするパターンです。数字や記号、空白などが1文字でも含まれている場合はマッチしません。

例1:PatternクラスとMatcherクラスを使う方法

まずは、java.util.regex.Pattern クラスと Matcher クラスを使った基本的な例です。5人の名前を入力として受け取り、それぞれが有効な名前(英字のみ)かどうかを判定します。

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

public class ContainsAlphabetExample {
   public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);
      String names[] = new String[5];
      for(int i = 0; i < names.length; i++){
         System.out.println("Enter your name: ");
         names[i] = sc.nextLine();
      }
      // 英字のみを受け付ける正規表現
      String regex = "^[a-zA-Z]*$";
      // Patternオブジェクトを作成
      Pattern pattern = Pattern.compile(regex);
      for (String name : names) {
         // Matcherオブジェクトを作成
         Matcher matcher = pattern.matcher(name);
         if(matcher.matches()) {
            System.out.println(name + " is a valid name");
         } else {
            System.out.println(name + " is not a valid name");
         }
      }
   }
}

実行結果

Enter your name:
krishna
Enter your name:
kasyap
Enter your name:
maruthi#
Enter your name:
Sai_Ram
Enter your name:
Vani.Viswanath
krishna is a valid name
kasyap is a valid name
maruthi# is not a valid name
Sai_Ram is not a valid name
Vani.Viswanath is not a valid name

実行結果を見ると、「krishna」や「kasyap」のように英字だけで構成された名前は有効と判定され、「maruthi#」のように記号 # を含む名前や、「Sai_Ram」の _、「Vani.Viswanath」の . のように英字以外の文字が含まれる場合は無効と判定されていることがわかります。

例2:String.matches()メソッドを使う簡潔な方法

String クラスには、正規表現との一致を簡単に確認できる matches() メソッドが用意されています。内部的にはPatternクラスが使われており、単純なチェックならこちらの方がコードをすっきり書けます。

import java.util.Scanner;

public class Just {
   public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);
      System.out.println("Enter your name: ");
      String name = sc.nextLine();
      String regex = "^[a-zA-Z]*$";
      boolean result = name.matches(regex);
      if(result) {
         System.out.println("Given name is valid");
      } else {
         System.out.println("Given name is not valid");
      }
   }
}

実行結果

Enter your name:
vasu#dev
Given name is not valid

入力された「vasu#dev」には記号 # が含まれているため、「Given name is not valid」と出力されます。

補足:より厳密なチェックを行いたい場合

空文字列も許可したくない場合は、*(0回以上)の代わりに +(1回以上)を使い、「^[a-zA-Z]+$」とすることで、少なくとも1文字以上の英字が含まれる文字列のみを有効とできます。用途に応じて正規表現を調整してみてください。

  1. Javaで文字列がASCII文字のみかどうかを判定する方法

    Javaでは、入力値のバリデーションや外部システムとのデータ連携の際に、「文字列がASCII文字のみで構成されているか」を確認したいケースがあります。本記事では、正規表現を使う方法と各文字のコード値を1つずつ検証する方法という2つのアプローチを、サンプルコードと実行結果付きでわかりやすく解説します。 方法1:正規表現を使って判定する ASCII文字のみで構成される文字列は、次の正規表現で表現できます。 \A\p{ASCII}*\z Stringクラスのmatches()メソッドは、引数に渡した正規表現と現在の文字列が一致すればtrue、一致しなければfalseを返します。判定したい文字列に対し

  2. 【Java】StringUtils.containsIgnoreCase()で大文字小文字を無視して部分文字列の有無を判定する方法

    Apache Commonsライブラリ(org.apache.commons.lang3パッケージ)のStringUtilsクラスには、containsIgnoreCase()という便利なメソッドが用意されています。 このメソッドは「元の文字列」と「検索文字列」の2つのString値を引数として受け取り、大文字と小文字の違いを無視したうえで、元の文字列の中に検索文字列が含まれているかどうかを判定します。戻り値はboolean型で、以下のようになります。 元の文字列に検索文字列が含まれている場合は true を返す 含まれていない場合は false を返す また、StringUtilsクラ