中安拓也のブログ

中安拓也がプログラミングについて書くブログ

【Java8】正規表現で半角数字だけの文字列を特定する

はじめに

Javaの正規表現を使って、半角数字だけで構成された文字列かどうかをチェックする方法について説明します。

環境

  • java version "1.8.0_45"

文字列が正規表現のパターンに適合するかチェックする

半角数字を1文字以上の(小数点やマイナス記号も含まない)正規表現([0-9]+)を使って、半角数字だけの文字列を特定していきます。

App.java

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

public class App {
    public static void main(String[] args) throws Exception {
        // (1) 正規表現のパターンを生成
        Pattern pattern = Pattern.compile("[0-9]+");

        // (2) 正規表現のパターンに適合するかをチェックする文字列を定義
        String sentence1 = "12";

        // (3) 正規表現処理をおこなうためのクラスを取得
        Matcher matcher1 = pattern.matcher(sentence1);

        // (4) 正規表現のパターンに適合するかチェック
        System.out.println(matcher1.matches());

        // (2) 正規表現のパターンに適合するかをチェックする文字列を定義
        String sentence2 = "1a2";

        // (3) 正規表現処理をおこなうためのクラスを取得
        Matcher matcher2 = pattern.matcher(sentence2);

        // (4) 正規表現のパターンに適合するかチェック
        System.out.println(matcher2.matches());

        // (2) 正規表現のパターンに適合するかをチェックする文字列を定義
        String sentence3 = "1.0";

        // (3) 正規表現処理をおこなうためのクラスを取得
        Matcher matcher3 = pattern.matcher(sentence3);

        // (4) 正規表現のパターンに適合するかチェック
        System.out.println(matcher3.matches());

        // (2) 正規表現のパターンに適合するかをチェックする文字列を定義
        String sentence4 = "-1";

        // (3) 正規表現処理をおこなうためのクラスを取得
        Matcher matcher4 = pattern.matcher(sentence4);

        // (4) 正規表現のパターンに適合するかチェック
        System.out.println(matcher4.matches());

        // (2) 正規表現のパターンに適合するかをチェックする文字列を定義
        String sentence5 = "485617";

        // (3) 正規表現処理をおこなうためのクラスを取得
        Matcher matcher5 = pattern.matcher(sentence5);

        // (4) 正規表現のパターンに適合するかチェック
        System.out.println(matcher5.matches());
    }
}

実行結果

true
false
false
false
true

処理の流れとしては、下記のようになります。

  1. 正規表現のパターンを生成(Pattern pattern = Pattern.compile("[0-9]+"))
  2. 正規表現のパターンに適合するかをチェックする文字列を定義(String sentence1 = "12";)
  3. 正規表現処理をおこなうためのクラスを取得(Matcher matcher1 = pattern.matcher(sentence1);)
  4. 正規表現のパターンに適合するかチェック(System.out.println(matcher3.matches());)

もっと簡単に正規表現を使う

先ほどの例と同じ処理をPatternクラス、Matcherクラスを使用せずに実施することもできます。

App.java

public class App {
    public static void main(String[] args) throws Exception {
        // (1) 正規表現の文字列を定義
        String regex = "[0-9]+";

        // (2) 正規表現のパターンに適合するかをチェックする文字列を定義
        String sentence1 = "12";

        // (3) 正規表現のパターンに適合するかチェック
        System.out.println(sentence1.matches(regex));

        // (2) 正規表現のパターンに適合するかをチェックする文字列を定義
        String sentence2 = "1a2";

        // (3) 正規表現のパターンに適合するかチェック
        System.out.println(sentence2.matches(regex));

        // (2) 正規表現のパターンに適合するかをチェックする文字列を定義
        String sentence3 = "1.0";

        // (3) 正規表現のパターンに適合するかチェック
        System.out.println(sentence3.matches(regex));

        // (2) 正規表現のパターンに適合するかをチェックする文字列を定義
        String sentence4 = "-1";

        // (3) 正規表現のパターンに適合するかチェック
        System.out.println(sentence4.matches(regex));

        // (2) 正規表現のパターンに適合するかをチェックする文字列を定義
        String sentence5 = "485617";

        // (3) 正規表現のパターンに適合するかチェック
        System.out.println(sentence5.matches(regex));
    }
}

実行結果

true
false
false
false
true

Stringクラスのmatchesメソッドを使うことで最初の例よりも短い処理で正規表現が実装できていることがわかります。

Stringクラスのmatchesメソッドを使うことでPatternクラス、Matcherクラス使う場合よりも簡単に正規表現の処理を実装することができますが、デメリットとしてStringクラスのmatchesメソッドを使うと内部でその度にPatternクラスやMatcherクラスを生成するため、何度も繰り返して処理をするような場合だと動作が遅くなってしまいます。

そのため、大量の文字列を繰り返し処理する必要があるような場合は、Patternクラス、Matcherクラスを使って正規表現の処理を実装したほうが良いでしょう。

参考文献