Javaの正規表現の基本。利用方法や組み合わせ、文字列の検索
たくさんの文字列の中から、電話番号や住所など、見付けたい文字を発見するために使われるのが正規表現です。Javaにおける正規表現の基本を押さえておきましょう。正規表現の利用方法や組み合わせについて詳しく解説します。
問題解決力を身に付ける若手、新人SE・PG向けの通年Java研修(1~3ヶ月コース)はこちら
目次[非表示]
- 1.Javaの正規表現の基本を押さえよう
- 1.1.正規表現は文字列の規則性を表す
- 1.2.正規表現をどのように利用するか
- 2.正規表現に使う記号
- 2.1.「^」(ハット記号)の使い方
- 2.2.「$」(ドル記号)の使い方
- 2.3.その他の正規表現
- 2.4.記号を使う際の注意点
- 3.正規表現の組み合わせ
- 4.正規表現の使い方
- 4.1.patternを作る
- 4.2.matchesメソッドを使用する
- 5.正規表現の具体的な使用例
- 5.1.数字をチェックする
- 5.2.英数字をチェックする
- 5.3.日付をチェックする
- 6.文字列の操作を行う
- 7.正規表現を活用してJavaをより便利に
Javaの正規表現の基本を押さえよう
プログラミングでは、正規表現を使って特定の文字を検索したり、置換したりといったことを行いますが、正規表現についてあいまいな理解をしている人も多いのではないでしょうか。
ですが正しく理解すれば大きな武器になりますので、正規表現の基本について詳しく学んでいきましょう。まずは、正規表現とは何か、定義や利用方法について解説します。
若手、新人エンジニアの成長を阻む 人材育成5つの失敗と解決策はこちら
正規表現は文字列の規則性を表す
正規表現とは、文字列の規則性を表す手法の一つで、主に文字列の中で条件に一致するものを一つの形式で表現します。
例えば、「WSHFDADA」という一見するとランダムな文字列でも、「半角英字である」という規則があります。このように、特定の条件に従って、文字列の規則を表現する手法を正規表現と呼ぶのです。
正規表現をどのように利用するか
具体的なコードサンプルと共に見ていきましょう
これは、strの文字列が、「123から始まるかどうか」を判定しています。
上記は、strの文字列が正規表現の規則性に当てはまっているかどうかを判定していて、if文により規則に当てはまっている場合はtrueを、そうでない場合はfalseを返すという処理を行っています。
この場合、「文字列の先頭が123である」という規則に従っているかどうかを判定しているため、
という結果を返します。
■関連記事
正規表現に使う記号
先ほどの例では「^」を使いました。このほかにも「$」など、正規表現の規則を確かめるために用いられる記号はいくつかあります。
記号とその役割を紹介しますので、正規表現を用いる際には活用してみてください。
「^」(ハット記号)の使い方
「^」(ハット記号)は、先ほども使ったとおり、文字列の先頭を意味しています。
(^123)で、文字列の先頭が123であるかどうかを判定していました。
例えば、(^080)と記載すれば、080から始まる電話番号かどうかを判定する、というような使い方が可能です。
「$」(ドル記号)の使い方
「$」(ドル記号)は、文字列の末尾に使います。その役割は、文字列の最後がその文字と一致するかどうかの判定です。
(号$)というような使い方をすれば雑誌や書籍などで、最後に「〇号」というナンバリングで終わるものをピックアップするような使い方ができます。
学歴、学部による「IT知識」「基礎知識」の格差を無くす個別指導の新人研修プロエンジニア育成コース(Java2・3ヶ月コース)はこちら
その他の正規表現
その他の正規表現には、次のようなものがあります。
記号 |
説明 |
正規表現 |
一致する例 |
* |
直前の文字が0回以上繰り返す |
sa*mple |
smple,sample,saampleなど |
+ |
直前の文字が1回以上繰り返す |
sa+mple |
sample,saampleなど |
- |
[ ]を使い範囲で指定する |
[1-5] |
1,2,3,4,5 |
? |
直前の文字が0個か1個の場合に一致 |
sa?mple |
smple,sampleなど |
. |
任意の1文字に一致 |
. |
A,あ |
{n,m} |
直前の文字列の最小桁数と最大桁数を指定 |
1{2,4} |
11,1111 |
{n} |
直前の文字の桁数を指定 |
1{5} |
11111 |
[ ] |
[ ]内のいずれか1文字と一致 |
[abcde] |
a,b,c,d,e |
[^...] |
[^ ]内の文字以外と一致 |
[^abcde] |
fghijなど |
記号を使う際の注意点
正規表現を使う際に注意したいのが、上記に紹介した記号のいずれかが、文字列の中に含まれている場合です。文字列の中に含まれていると、エラーが発生するなどして、判定が行えなくなる可能性があります。
その場合、記号の前に「\」を書くことで、正規表現として判定されるのを回避(escape=エスケプ)することができます。
全国の若手~ベテランエンジニアが受講している個別指導のオンライン・リモート講座(入門5日・基礎10日)はこちら
この?を文字列として判定したい場合、
と記載します。
■関連記事
正規表現の組み合わせ
上記に記載した正規表現は、複数の記号を組み合わせることも可能です。
2つの条件のいずれかに一致する(or)の場合と、両方に一致する(and)の条件それぞれの使い方について解説します。
貴社の希望日に合わせて受講できる個別指導型の短期Java講座(入門5日・基礎10日)はこちら
2つの条件のどちらかに一致する組み合わせ
正規表現で2つの条件のどちらかに一致する(or)の判定をする場合は、以下のように記述します。
この「|」(パイプ)という記号が、どちらかに一致するかを判定する記号になります。以下のような使い方をすることができます。
例題は、「はじめに」から始まる、もしくは「次に」から始まる、いずれかの文章かどうかを判定しています。
また、正規表現を使わずに以下の様に記述することも可能です。
2つの条件のいずれにも一致する組み合わせ
2つの条件の両方を満たす組み合わせ(and)の判定をする場合は、以下のように記述します。
「*」の記号が、条件1と2の両方を満たす判定をするための記号です。以下のように記述することができます。
例題は「1からはじまる」「9で終わる」という両方の条件に満たす文字列を判定しています。なお、正規表現を使わずに、以下のように記述することも可能です。
正規表現の使い方
Javaの正規表現では「Pattern」と「Matcher」というクラスを使います。それぞれの用途と具体的な使い方について解説します。
全国の若手~ベテランエンジニアが受講している個別指導のオンライン・リモート講座(入門5日・基礎10日)資料ダウンロードはこちら
patternを作る
patternは、規則性を作るためのクラスです。Patternクラスのcompileメソッドの引数に、規則性を指定する形で作成します。
次のコードとともに見ていきましょう。
このコードでは、「(3桁の数字)-(4桁の数字)-(4桁の数字)」というpatternを作成しています。 patternは、matcherオブジェクトを使って、一致するかどうかを調べるといったことができます。
電話番号がパターンで作った条件と一致しているため、このコードではtrueを返します。パターンには色々な使い方があるので覚えていきましょう。
matchesメソッドを使用する
matchersメソッドは、指定した条件と一致するかをチェックするメソッドです。
このコードでは、matchersメソッドを用いて完全に一致したときに「true」、一致しない場合は「false」を返す仕組みです。
1行目の「System.out.println(str.matches("私は動物園に出かけた"));」は、文字列の「公園」と「動物園」が一致しないため、falseを返します。
2行目の「System.out.println(str.matches(".*私は.*"));」は、「*」があることで、「私は」という文字がどこかに入っている場合は一致している、という判定をしています。そのため、2行目はtrueを返します。
■関連記事
正規表現の具体的な使用例
正規表現を使ってどのようなことができるのかを、使用例とともに解説します。
個別指導の新人研修プロエンジニア育成コース(Java2・3ヶ月コース)資料ダウンロードはこちら
数字をチェックする
文字列が数字であるかどうかをチェックする正規表現の記述は、以下のようになります。
「0から9までの数字を1回以上繰り返している」という意味になり、文字列がすべて数字の場合のチェックができるようになります。
英数字をチェックする
英数字のチェックは、以下のように記述します。
文法的は数字のチェックと同じです。文字列の条件の中に、英字の小文字と大文字を加えたものになります。
日付をチェックする
日付は西暦や年号かによっても変わってきます。今回は西暦をチェックする正規表現の記述を紹介しましょう。
「4桁の数字」/「2桁の数字」/「2桁の数字」という順番で、このパターンに当てはまるかどうかをチェックしています。
日付を厳密に正規表現でチェックしようとすると、閏年や年号が入ってくるため少し手がかかります。その場合はオブジェクトを作成してしまった方が良いでしょう。
文字列の操作を行う
ここまで紹介した正規表現については、順番に並んでいる文字をチェックするものでしたが、その他の操作についても覚えておきましょう。
文字列の検索、置き換え、分割などの操作する方法に関して解説します。
大手上場企業のエンジニアも受講している短期Java入門5日・基礎10日講座はこちら
文字列を検索する
文字列の中で、文字列の中にある特定の文字列を検索するために使います。下記の例とともに見ていきましょう。
このコードでは「都」という文字が、文字列の何番目にあるかを検索しています。結果は、以下のように表示されます。
カウントしているのは、バイト数ではなく文字数、0番目から始まらないように「start+1」という記述を加えている点に注意が必要です。
文字列を分割する
文字列を分割して出力する方法について解説します。以下の処理を使えば、文字列をあるキーワードを条件に区切るといったことが可能です。これを使うと、例えば改行がされずに1行でまとめられてしまっている文章を行ごとに分ける、といったことに使えます。
上記は、〇もしくは×で文字列を区切っています。結果は以下のように表示されます。
「〇|×」ではなく「,」で区切ることも可能です。特定の条件で列を分割するのにとても便利です。
サンプルとなっているコードでは、検索条件である〇と×は含んでいません。
■関連記事
正規表現を活用してJavaをより便利に
正規表現を用いると、文字列の中にある特定の文字や、文字の並びやパターン、文字の種類などを区別してピックアップできるようになります。
この機能は、文字列の中から電話番号やメールアドレス、IPアドレスや日付など、特定のデータを抽出したいときにとても重宝します。
正規表現を覚えておくことで、Javaでユーザー用にアプリやシステムを作成しようとしたときに、仕様の幅が広がりますので、ぜひ覚えておきましょう。