Java

初心者必見!Javaにおける正規表現の基本と使い方を具体例で解説!

一般的なシステム開発において、文字列の検索や置換はよく使われる処理です。それらを実装する際に活躍するのが、正規表現です。
今回は正規表現とは何かということから基本的な使い方までをまとめました。ぜひ参考にしてください。

Javaの正規表現

正規表現とは

正規表現とは、ある文字列の中に特定のパターンに一致する部分があるか調べる際に用いられる表記法です。
特定のパターンといっても「10桁の半角数字」や「数字から始まる8桁の半角英数字」のような単純なものから、「3桁の数字の後にハイフンが続き、その次に4桁の数字」のような複雑なものまで様々です。

メタ文字と呼ばれる特殊な意味を持った文字を組み合わせることで、このようなパターンをシンプルに定義することができます。

正規表現でできること

正規表現でできることは、大きく分けて3つあります。

1つ目は、特定の文字列そのものを探すことです。この機能は、正規表現の最も基本的な機能と言えます。定義するパターンも、見つけたい文字列そのものを指定するだけです。

2つ目は、複数の候補うちのいずれかのパターンに該当する文字列、または文字を探すことです。いわゆるor検索のことで、「[ ]」や「-」などのメタ文字を使ってパターンを定義します。

3つ目は、「JavaJava」、「111」のように繰り返している文字列、または文字を探すことです。「*」や「+」などのメタ文字を使ってパターンを定義します。

主な正規表現

以下は、正規表現に使われるメタ文字の一覧です。これらのメタ文字と英数字などの単なる文字を組み合わせて、様々なパターンを定義します。

正規表現 説明
* 直前の1文字の0回以上の繰り返しと一致 使い方:programing*
一致する文字列:programming, programmingggなど
+ 直前の文字の1回以上の繰り返しと一致 使い方:program+ming
一致する文字列:programmming, programmmmingなど
. 改行以外の任意の1文字と一致 使い方:pro.ramming
一致する文字列:programming, probrammingなど
? 直前の文字が0個または1個の場合に一致 使い方:programming?
一致する文字列:programming, programmin
^ 行の先頭と一致 使い方:^programming
一致する文字列:programmingは楽しい など
$ 行の末尾と一致 使い方:$programming
一致する文字列:楽しいprogramming など
[ ]内で使用し、範囲を指定できる 使い方:[3-5]
一致する文字列:3, 4, 5
| 直前または直後のどちらかのパターンに一致 使い方:programming|cording
一致する文字列:programming, cording
[ ] カッコ内の任意の1文字と一致 使い方:[prog]
一致する文字列:p, r, o, g
[^] カッコ内の任意の1文字と不一致 使い方:[^prog]
一致する文字列:a, m, i, n など
{ } カッコ内の数値の繰り返しと一致 使い方:programm{3}ing
一致する文字列:programmming, programmmmingなど
( ) カッコ内をグループ化 使い方:(programming)
一致する文字列:programming, pormigrgamnなど

正規表現の使い方

Javaで正規表現を使って文字列をチェックすると、次のようになります。

public class Main {
    public static void main(String[] args) {
 
       // チェックする文字列
       String str = “programming”;
 
       // 正規表現で小文字の英字から始まっているかチェック
       if(str.matches(”^[a-z]+$”)){
          System.out.println(str + “は小文字の英字から始まります”);
       }else{
          System.out.println(str + “は小文字の英字から始まりません”);
       }
    }
}

今回の例におけるポイントは、8行目にある

str.matches(”^[a-z]+$”)

です。

matchesは、後ろのカッコ内で定義した正規表現のパターンで文字列をチェックするメソッドです。今回の場合、変数strに格納されている文字列”programming”が、「小文字のaからz」のどれかから始まっているかをチェックしています。

”programming”は小文字のpから始まっているので、実行結果は

programmingは小文字の英字から始まります

となります。

正規表現を用いたチェックのパターン

ここからは、実際にシステム開発の現場でもよく使われる、正規表現を使ったチェックパターンを紹介します。

数字

数字をチェックするパターンは次の通りです。

“^[0-9]+$”

また、次のようにも書き換えられます。

“^[\d]+$”

「\d」は0から9の半角数字を意味します。

実際にプログラムの中で使うと、次のようになります。

public class Main {
    public static void main(String[] args) {
 
       // チェックする文字列
       String str = “12345”;
 
       // 正規表現で数字の形式になっているかチェック
        if(str.matches(”^[0-9]+$”)){
             System.out.println(str + “は数字です”);
        }else{
             System.out.println(str + “は数字ではありません”);
        }
    }
}

この場合、”12345”は数字の形式と一致するので、実行結果は「12345は数字です」となります。

英数字

英数字をチェックするパターンは次の通りです。

“^[a-zA-Z0-9]+$”

また、次のようにも書き換えられます。

“^[\\w]+$”

「\w」は、aからzの小文字の半角英字、AからZの大文字の半角英字、0から9の半角数字を意味します。また、「\」が2つ付いているのは、エスケープ処理をしているからです。エスケープ処理については次の章で解説します。

実際にプログラムの中で使うと、次のようになります。

public class Main {
    public static void main(String[] args) {
 
       // チェックする文字列
       String str = “Java12345”;
 
       // 正規表現で英数字の形式になっているかチェック
       if(str.matches(“^[a-zA-Z0-9]+$”)){
          System.out.println(str + “は英数字から始まっています”);
       }else{
          System.out.println(str + “は英数字から始まっていません”);
       }
    }
}

この場合、”Java12345”は英数字の形式と一致するので、実行結果は「Java12345は英数字から始まっています」となります。

電話番号

電話番号をチェックするパターンは次の通りです。

“^[0-9]{2,4}-[0-9]{2,4}-[0-9]{3,4}$”

また、次のようにも書き換えられます。

”^\d{2,4}-\d{2,4}-\d{3,4}$”

ちなみに、携帯電話の番号をチェックするパターンは次のようになります。

“^(0[789]0)-\d{4}-\d{4}$”

実際にプログラムの中で使うと、次のようになります。

public class Main {
    public static void main(String[] args) {
 
       // チェックする文字列
        String str = “0120-345-678”;
 
       // 正規表現で電話番号の形式になっているかチェック
       if(str.matches(“^[0-9]{2,4}-[0-9]{2,4}-[0-9]{3,4}$”)){
          System.out.println(str + “は電話番号です”);
       }else{
          System.out.println(str + “は電話番号ではありません”);
       }
    }
}

この場合、”0120-345-678”は電話番号の形式と一致するので、実行結果は「0120-345-678は電話番号です」となります。

メールアドレス

メールアドレスは次のように、@を挟んで左側がユーザーが任意で設定できる文字列、右側がドメインとなっています。

ユーザー任意の文字列@ドメイン

今回はどちらも、半角英数字と記号「!#$%&’*+-/=?^_`{|}~.」を使用可能対象とします。

メールアドレスをチェックするパターンは次の通りです。

“^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$”

実際にプログラムの中で使うと、次のようになります。

public class Main {
    public static void main(String[] args) {
 
       // チェックする文字列
        String str = “programming-java@sample.com”;
 
       // 正規表現でメールアドレスの形式になっているかチェック
       if(str.matches(“^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$”)){
          System.out.println(str + “はメールアドレスです”);
       }else{
          System.out.println(str + “はメールアドレスではありません”);
       }
    }
}

この場合、”programming-java@sample.com”はメールアドレスの形式と一致するので、実行結果は「programming-java@sample.comはメールアドレスです」となります。

郵便番号

郵便番号をチェックするパターンは次の通りです。

“^[0-9]{3}-[0-9]{4}$”

また、次のようにも書き換えられます。

”^\d{3}-\d{4}$”

実際にプログラムの中で使うと、次のようになります。

public class Main {
    public static void main(String[] args) {
 
       // チェックする文字列
        String str = “123-4567”;
 
       // 正規表現で郵便番号の形式になっているかチェック
       if(str.matches(“^^[0-9]{3}-[0-9]{4}$”)){
          System.out.println(str + “は郵便番号です”);
       }else{
          System.out.println(str + “は郵便番号ではありません”);
       }
    }
}

この場合、”123-4567”は郵便番号の形式と一致するので、実行結果は「123-4567は郵便番号です」となります。

エスケープ処理

エスケープ処理とは

正規表現において、メタ文字はパターンを表現するための特殊な意味を持っています。しかし、時にはメタ文字を単なる文字として扱いたいこともあるでしょう。
そんな時はエスケープ処理を行います。エスケープ処理をすることで、特殊な意味を持たない単なる文字としてメタ文字を扱えるようになります。

エスケープ処理の方法

エスケープ処理をするには、単なる文字として扱いたいメタ文字の前にバックスラッシュ「\」をつけます。使用している環境によっては「¥」になりますが、どちらを使っても問題ありません。

メタ文字をエスケープ処理をすると、それぞれ次のようになります。

エスケープ処理前 エスケープ処理後
\ \\
* \*
+ \+
. \.
? \?
^ \^
$ \$
\-
| \|
{ または } \{ または \}
( または ) \( または \)
[ または ] \[ または \]

また、「-」については、[]の中で使われた時のみ特殊な意味を持つので、[]の中で単なる文字として扱いたい場合にのみエスケープ処理が必要となります。

それぞれどのように使うかは、前章で確認してくださいね。

まとめ

今回は、Javaにおける正規表現の使い方について、例を挙げて紹介しました。メタ文字自体はそこまで種類が多くないので、細かいルールさえ覚えてしまえば、色々なパターンを定義できそうですね。もしわからなくなったら、もう一度この記事に戻って確認しましょう。

このブログでは他にもJava初心者向けに情報を発信しています!ぜひご覧ください。

【初心者向け】Javaの配列について一挙解説!配列の操作方法がわかる! 「Javaの配列がよくわからない。配列の宣言の仕方とか、操作方法とか、全部一括でまとまっているサイトが見つからない」 ...
【初心者向け】Javaのスキルアップと学習方法について解説!Javaのスキルアップ方法について解説していきます。どうすれば初心者が中級者へと上がれるのか、具体的なアクション例を紹介していきます。...

プログラミングの家庭教師『Tech Teacher』


引用元:Tech Teacher

「スクールに通い続ける自信がない…」
「時間がなくてスクールに通えない…」

そんな方にはプログラミングの家庭教師『Tech Teacher』がおすすめです。
Tech Teacherはマンツーマン指導なので、生徒様一人ひとりに最適な指導を行うことができます。また、オンライン指導も可能なので、全国どこにいても家庭教師の授業を受けることができます。

Tech Teacherの3つの特徴


生徒様に最適化されたマンツーマン指導
完全マンツーマンの指導なので、生徒様の目的・学習状況・ご要望に合わせて、最適な指導をご提供いたします。

指導力・人柄・相性の優れた教師のご紹介
Tech Teacherには採用率20%の選考を突破した、指導力の高い教師が在籍しています。また、選考では指導力だけではなく人柄も重視しております。

1,000人の教師が在籍!幅広い指導に対応可能
業界トップレベルの1,000人の教師が在籍しています。そのため、幅広い言語・ツール・目的に対応することができます。

家庭教師ならではの5つの魅力


オーダーメイドのカリキュラム
生徒様一人ひとりに習熟度・目的・期間に応じて最適なカリキュラムを提供いたします。

きめ細やかなフォローが可能
生徒様からのご要望にきめ細やかに対応し、学習計画や勉強法などの指導もできるので、普段の勉強も捗ります。

習い事・学業・お仕事との両立が簡単
教室に通う必要がないので親御様の送迎も不要です。授業時間・頻度を生徒様のご都合に合わせて自由に調節することができます。

自分のペースで進められる
生徒様の理解度や意欲に応じて授業のスピードを調節できます。不明点や疑問点は都度立ち止まって解消できるので、着実に理解して進むことができます。

すぐ質問できるから挫折しない
先生を独り占めできるので、周りの目を気にすることなく分からないところをいつでも質問できます。

Tech Teacherへのお問い合わせ

無料体験授業・資料請求のお問い合わせはこちらから

質問のみのお問い合わせも受け付けております。