catch-img

Javaの正規表現の基本。利用方法や組み合わせ、文字列の検索

たくさんの文字列の中から、電話番号や住所など、見付けたい文字を発見するために使われるのが正規表現です。Javaにおける正規表現の基本を押さえておきましょう。正規表現の利用方法や組み合わせについて詳しく解説します。

問題解決力を身に付ける若手、新人SE・PG向けの通年Java研修(1~3ヶ月コース)はこちら

目次[非表示]

  1. 1.Javaの正規表現の基本を押さえよう
  2. 2.正規表現に使う記号
  3. 3.正規表現の組み合わせ
  4. 4.正規表現の使い方
  5. 5.正規表現の具体的な使用例
  6. 6.文字列の操作を行う
  7. 7.正規表現を活用してJavaをより便利に

Javaの正規表現の基本を押さえよう

プログラミングでは、正規表現を使って特定の文字を検索したり、置換したりといったことを行いますが、正規表現についてあいまいな理解をしている人も多いのではないでしょうか。

ですが正しく理解すれば大きな武器になりますので、正規表現の基本について詳しく学んでいきましょう。まずは、正規表現とは何か、定義や利用方法について解説します。

若手、新人エンジニアの成長を阻む 人材育成5つの失敗と解決策はこちら

正規表現は文字列の規則性を表す

正規表現とは、文字列の規則性を表す手法の一つで、主に文字列の中で条件に一致するものを一つの形式で表現します。

例えば、「WSHFDADA」という一見するとランダムな文字列でも、「半角英字である」という規則があります。このように、特定の条件に従って、文字列の規則を表現する手法を正規表現と呼ぶのです。

正規表現をどのように利用するか

具体的なコードサンプルと共に見ていきましょう

import java.util.regex.Pattern;
public class Main {
 public static void main(String[] args) {
  String str = "123456789" ;
  String pattern = "^123" ;
  Pattern p = Pattern.compile(pattern);
  if(p.matcher(str).find()){
   System.out.println(str + "は123の数字からスタートします");
  }
  else{
   System.out.println(str + "は123以外の数字から始まります");
  }
 }
}

これは、strの文字列が、「123から始まるかどうか」を判定しています。

p.matcher(str).find()

上記は、strの文字列が正規表現の規則性に当てはまっているかどうかを判定していて、if文により規則に当てはまっている場合はtrueを、そうでない場合はfalseを返すという処理を行っています。

この場合、「文字列の先頭が123である」という規則に従っているかどうかを判定しているため、

123456789123の数字からスタートします

という結果を返します。

■関連記事

正規表現に使う記号

先ほどの例では「^」を使いました。このほかにも「$」など、正規表現の規則を確かめるために用いられる記号はいくつかあります。

記号とその役割を紹介しますので、正規表現を用いる際には活用してみてください。

「^」(ハット記号)の使い方

「^」(ハット記号)は、先ほども使ったとおり、文字列の先頭を意味しています。

(^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)の判定をする場合は、以下のように記述します。

条件1|条件2

この「|」(パイプ)という記号が、どちらかに一致するかを判定する記号になります。以下のような使い方をすることができます。

^はじめに|^次に

例題は、「はじめに」から始まる、もしくは「次に」から始まる、いずれかの文章かどうかを判定しています。

また、正規表現を使わずに以下の様に記述することも可能です。

Pattern pattern1 = Pattern.compile("^はじめに");
Pattern pattern2 = Pattern.compile("^次に");
String str = "はじめに、手洗いうがいをしましょう" ;
System.out.println( pattern1.matcher(str).find() || pattern2.matcher(str).find());

2つの条件のいずれにも一致する組み合わせ

2つの条件の両方を満たす組み合わせ(and)の判定をする場合は、以下のように記述します。

条件1*条件2

「*」の記号が、条件1と2の両方を満たす判定をするための記号です。以下のように記述することができます。

^1*9$

例題は「1からはじまる」「9で終わる」という両方の条件に満たす文字列を判定しています。なお、正規表現を使わずに、以下のように記述することも可能です。

Pattern pattern1 = Pattern.compile("^1");
Pattern pattern2 = Pattern.compile("9$");
String str = "123456789" ;
System.out.println( pattern1.matcher(str).find() && pattern2.matcher(str).find());

正規表現の使い方

Javaの正規表現では「Pattern」と「Matcher」というクラスを使います。それぞれの用途と具体的な使い方について解説します。

全国の若手~ベテランエンジニアが受講している個別指導のオンライン・リモート講座(入門5日・基礎10日)資料ダウンロードはこちら

patternを作る

patternは、規則性を作るためのクラスです。Patternクラスのcompileメソッドの引数に、規則性を指定する形で作成します。

次のコードとともに見ていきましょう。

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
 public static void main(String[] args) {
  String str = "電話番号 090-1111-2222";
  Pattern p = Pattern.compile("[0-9]{3}-[0-9]{4}-[0-9]{4}");
 }
}

このコードでは、「(3桁の数字)-(4桁の数字)-(4桁の数字)」というpatternを作成しています。 patternは、matcherオブジェクトを使って、一致するかどうかを調べるといったことができます。 

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
 public static void main(String[] args) {
  String str = "電話番号 090-1111-2222";
  Pattern p = Pattern.compile("[0-9]{3}-[0-9]{4}-[0-9]{4}");
  Matcher m = p.matcher(str);
  System.out.println(m.find());
 }
}

電話番号がパターンで作った条件と一致しているため、このコードではtrueを返します。パターンには色々な使い方があるので覚えていきましょう。

matchesメソッドを使用する

matchersメソッドは、指定した条件と一致するかをチェックするメソッドです。

public class Main {
 public static void main(String[] args) {
  String str = "私は公園に出かけた";
  System.out.println(str.matches("私は動物園に出かけた"));
  System.out.println(str.matches(".*私は.*"));
 }
}

このコードでは、matchersメソッドを用いて完全に一致したときに「true」、一致しない場合は「false」を返す仕組みです。

1行目の「System.out.println(str.matches("私は動物園に出かけた"));」は、文字列の「公園」と「動物園」が一致しないため、falseを返します。

2行目の「System.out.println(str.matches(".*私は.*"));」は、「*」があることで、「私は」という文字がどこかに入っている場合は一致している、という判定をしています。そのため、2行目はtrueを返します。

■関連記事

正規表現の具体的な使用例

正規表現を使ってどのようなことができるのかを、使用例とともに解説します。

個別指導の新人研修プロエンジニア育成コース(Java2・3ヶ月コース)資料ダウンロードはこちら

数字をチェックする

文字列が数字であるかどうかをチェックする正規表現の記述は、以下のようになります。

^[0-9]+$

「0から9までの数字を1回以上繰り返している」という意味になり、文字列がすべて数字の場合のチェックができるようになります。

英数字をチェックする

英数字のチェックは、以下のように記述します。

^[0-9a-zA-Z]+$

文法的は数字のチェックと同じです。文字列の条件の中に、英字の小文字と大文字を加えたものになります。

日付をチェックする

日付は西暦や年号かによっても変わってきます。今回は西暦をチェックする正規表現の記述を紹介しましょう。

^[0-9]{4}/[0-9]{2}/[0-9]{2}$

「4桁の数字」/「2桁の数字」/「2桁の数字」という順番で、このパターンに当てはまるかどうかをチェックしています。

日付を厳密に正規表現でチェックしようとすると、閏年や年号が入ってくるため少し手がかかります。その場合はオブジェクトを作成してしまった方が良いでしょう。

文字列の操作を行う

ここまで紹介した正規表現については、順番に並んでいる文字をチェックするものでしたが、その他の操作についても覚えておきましょう。

文字列の検索、置き換え、分割などの操作する方法に関して解説します。

大手上場企業のエンジニアも受講している短期Java入門5日・基礎10日講座はこちら

文字列を検索する

文字列の中で、文字列の中にある特定の文字列を検索するために使います。下記の例とともに見ていきましょう。

import java.util.regex.Matcher; 
import java.util.regex.Pattern;
public class Main {
 public static void main(String[] args) {
  String str = "東京都山口県千葉県埼玉県神奈川県東京都京都府" ;
  String pattern = "都" ;
  Pattern test = Pattern.compile(pattern);
  Matcher matcher = test.matcher(str) ;
  while(matcher.find()){
   int start = matcher.start();
   System.out.println(start+1 + "番目にあります");
  }
 }
}

このコードでは「都」という文字が、文字列の何番目にあるかを検索しています。結果は、以下のように表示されます。

3番目にあります 19番目にあります 21番目にあります

カウントしているのは、バイト数ではなく文字数、0番目から始まらないように「start+1」という記述を加えている点に注意が必要です。

文字列を分割する

文字列を分割して出力する方法について解説します。以下の処理を使えば、文字列をあるキーワードを条件に区切るといったことが可能です。これを使うと、例えば改行がされずに1行でまとめられてしまっている文章を行ごとに分ける、といったことに使えます。

import java.util.regex.Pattern;
public class Main {
 public static void main(String[] args) {
  String str = "参加します〇不参加です×参加します〇参加です〇不参加になります×参加希望〇" ;
  String pattern = "〇|×" ;
  Pattern kibou =
  Pattern.compile(pattern);
  for(String substr : kibou.split(str)){
   System.out.println(substr);
  }
 }
}

上記は、〇もしくは×で文字列を区切っています。結果は以下のように表示されます。

参加します 不参加です 参加します 参加です 不参加になります 参加希望

「〇|×」ではなく「,」で区切ることも可能です。特定の条件で列を分割するのにとても便利です。

サンプルとなっているコードでは、検索条件である〇と×は含んでいません。

■関連記事

正規表現を活用してJavaをより便利に

正規表現を用いると、文字列の中にある特定の文字や、文字の並びやパターン、文字の種類などを区別してピックアップできるようになります。

この機能は、文字列の中から電話番号やメールアドレス、IPアドレスや日付など、特定のデータを抽出したいときにとても重宝します。

正規表現を覚えておくことで、Javaでユーザー用にアプリやシステムを作成しようとしたときに、仕様の幅が広がりますので、ぜひ覚えておきましょう。

新卒・中途未経験者を採用した
企業におすすめのエンジニア研修サービス

法人研修の実績2700名以上!中小企業~大手上場企業まで幅広く受講してます。
若手、新人エンジニア採用後の Java研修はジョブサポートお任せ下さい
短期講座(入門5日、基礎10日) Java・フロントエンド (HTML5・CSS・JavaScript) 全国の中小~大手企業まで幅広くお問い合わせ、 受講を頂く人気講座です

運営会社

株式会社ジョブサポート

Java・フロントエンド(HTML5・CSS・JavaScript)の企業研修実績2700名以上を実施。受講満足度は95%。

おすすめお役立ち資料

おすすめお役立ち資料02
おすすめお役立ち資料02

関連記事

研修サービス一覧

プロエンジニア育成コース
新人エンジニア研修
短期通学講座
研修実績
よくあるご質問

ランキング

タグ一覧