Java言語に限らずですが、プログラミングを行なっていると必ず遭遇することになるのが正規表現です。
しかし、正規表現はパターンの数も多く、使うケースも限られることからどうしても苦手意識を抱えている方が多いのも事実です。
本記事では、正規表現を利用する初心者の方向けに、主にJavaで利用する際の基本的な使い方についてご紹介していきたいと思います。
本記事の内容で、正規表現をマスター出来るといった内容ではありませんが、苦手意識を取り除くための第一歩になるような基本的な部分について学習していきましょう。
Java 正規表現とは
Java正規表現とは、主にJava言語のプログラミング時に用いられる正規表現の記述方法を意味します。
正規表現とは、「ある特定の文字列パターンを1つの形式で表現する方法」のことを指します。
Javaと他のプログラミング言語で正規表現の書き方は異なるの?
正規表現の書き方自体は、プログラミング言語によって異なることは基本的にありません。
正規表現はあくまで文字列のパターンを解析して、指定した文字列と正規表現のパターンが一致しているかを確認するためのものです。
本記事では、あえてJava正規表現と記載させていただいておりますが、サンプルなどでJavaプログラミングでのソースコードを使用するためであり、正規表現自体は別のプログラミング言語でも同様に使用可能です。
Java正規表現の基本を確認しよう
Java正規表現の基本は、文字列比較を行うためのメソッドとして、Stringクラスのmatchesメソッドを利用します。
String target = "あいうえお 123-4567"; target.matches("正規表現");
matchesメソッドでは、matchesメソッドの引数に正規表現を指定することで、「target(サンプルの例では”あいうえお 123-4567″)」に当たる文字列と一致しているかを確認することが可能となります。
実際にJava正規表現を利用する際の書き方は?
Java正規表現で利用するmatchesメソッドでは、正規表現で指定したパターンと一致しているかを判定したのち、返り値として「true」または「false」が返却されます。
正規表現でチェックした条件の結果で処理を分岐する、下記のような書き方が一般的です。
String target = "あいうえお 123-4567"; if(target.matches("正規表現")) { // 正規表現で指定したパターンと一致していた場合の処理 } else { // 正規表現で指定したパターンと異なる場合の処理 }
ここで注意していただきたいのは、matchesメソッドは対象の文字列(サンプルの例では”あいうえお 123-4567″)と正規表現で指定したパターンが完全一致する場合にのみ「true」を返却するという点に注意しておきましょう。
そのため下記のようなコードの場合は、比較結果が「false」となり、else側の処理が実施されます。
※「”[0-9]{3}-[0-9]{4}”」は、0から9までの数値が3つ + “-” + 0から9までの数値が4つ(ex:123-4567)を表す正規表現です。
String target = "あいうえお 123-4567"; if(target.matches("[0-9]{3}-[0-9]{4}")) { // 正規表現で指定したパターンと一致していた場合の処理 } else { // 正規表現で指定したパターンと異なる場合の処理 }
なぜ比較結果が「false」となるかというと、対象の文字列に”あいうえお”という”[0-9]{3}-[0-9]{4}”の正規表現には一致しない文字列が含まれているためです。
今回のサンプルで、比較結果を「true」としたい場合には下記のように実装する必要があります。
String target = "あいうえお 123-4567"; if(target.matches(".*[0-9]{3}-[0-9]{4}.*")) { // 正規表現で指定したパターンと一致していた場合の処理 } else { // 正規表現で指定したパターンと異なる場合の処理 }
正規表現の中に「.*」を追加していますが、これが数値の前後に文字列があってもOKといった意味合いの記述方法となるためです。
Java 正規表現ではPatternクラスとMatcherクラスの使用が一般的
Javaで正規表現を利用する際の基本は、上述しましたようにStringクラスのmatchesメソッドを利用した書き方ですが、実際に開発を行なっていく際にはPatternクラスとMatcherクラスを利用したコーティングが一般的になっています。
Patternクラス Matcherクラスを利用した実装方法
PatternクラスとMacherクラスを利用するためには、java.util.regexをインポートしておく必要があります。
import java.util.regex.Pattern; import java.util.regex.Matter;
まずPatternクラスのcompileメソッドの引数に正規表現のパターンを指定します。
Pattern pattern1 = Pattern.compile("[0-9]{3}-[0-9]{4}")
次にPatternクラスのmatcherメソッドの引数に、正規表現と一致するかを確認したい文字列を指定します。
Matcher matcher1 = pattern1.matcher("あいうえお 123-4567");
Matcherオブジェクトのfindメソッドを使用することで、正規表現に一致した文字列かどうかを確認することが出来ます。
System.out.println(matcher1.find());
実行した結果は、「true」となります。
Stringクラスのmatchesメソッドを使用した際には、正規表現パターンと比較文字列が完全一致する必要がありましたが、Matcherオブジェクトのfindメソッドを利用した場合、比較対象の文字列に正規表現に該当するパターンが含まれれば「true」が返却される結果となります。
まとめ
本記事では、Java正規表現の基本的な部分に絞ってご紹介してきました。
今回の説明で利用した「郵便番号チェック」以外にも正規表現には様々な記述方法が存在します。
Javaの正規表現はご紹介した基本の記述方法さえ理解していれば、正規表現自体を全て覚えておく必要はなく、その都度検索して正規表現部分のみを入れ替えれば実装することが可能です。
今回ご紹介した、Stringクラスでのmatchesメソッドを使用した正規表現、PatternクラスとMatcherクラスを使用した正規表現の2つをしっかりと理解していただき、ぜひ実務でも迷うことなくJava正規表現を使えるようになりましょう。