catch-img

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

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

目次[非表示]

  1. 1.Javaの正規表現の基本を押さえよう
    1. 1.1.正規表現は文字列の規則性を表す
    2. 1.2.正規表現をどのように利用するか
  2. 2.正規表現に使う記号
    1. 2.1.「^」(ハット記号)の使い方
    2. 2.2.「$」(ドル記号)の使い方
    3. 2.3.その他の正規表現
    4. 2.4.記号を使う際の注意点
  3. 3.正規表現の組み合わせ
    1. 3.1.2つの条件のどちらかに一致する組み合わせ
    2. 3.2.2つの条件のいずれにも一致する組み合わせ
  4. 4.正規表現の使い方
    1. 4.1.patternを作る
    2. 4.2.matchesメソッドを使用する
  5. 5.正規表現の具体的な使用例
    1. 5.1.数字をチェックする
    2. 5.2.英数字をチェックする
    3. 5.3.日付をチェックする
  6. 6.文字列の操作を行う
    1. 6.1.文字列を検索する
    2. 6.2.文字列を分割する
  7. 7.正規表現を活用してJavaをより便利に

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

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

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

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

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

例えば、「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から始まる電話番号かどうかを判定する、というような使い方が可能です。

「$」(ドル記号)の使い方

「$」(ドル記号)は、文字列の末尾に使います。その役割は、文字列の最後がその文字と一致するかどうかの判定です。

(号$)というような使い方をすれば雑誌や書籍などで、最後に「〇号」というナンバリングで終わるものをピックアップするような使い方ができます。

その他の正規表現

その他の正規表現には、次のようなものがあります。

記号
説明
正規表現
一致する例
*
直前の文字が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=エスケプ)することができます。

今日の天気は?

この?を文字列として判定したい場合、

今日の天気は\?

と記載します。

正規表現の組み合わせ

上記に記載した正規表現は、複数の記号を組み合わせることも可能です。

2つの条件のいずれかに一致する(or)の場合と、両方に一致する(and)の条件それぞれの使い方について解説します。

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」というクラスを使います。それぞれの用途と具体的な使い方について解説します。

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を返します。

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

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

数字をチェックする

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

^[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の研修についていけない新人には丁寧に教える。その理由とは

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

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

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

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

資料請求はこちらから

職場で使用されているアドレスをご記入下さい。

アップロードしています。少々お待ちください。