書き方を覚えよう!Javaで正規表現を使う方法【初心者向け】

初心者向けにJavaで正規表現を使う方法について解説しています。最初慣れるまで少し時間がかかるかもしれませんが、プログラムを書く上では理解しておきたい正規表現です。パターンが決まっているので、実際に書きながら覚えていきましょう。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

この記事ではJavaで正規表現を使う方法を説明します。実際にサンプルコードを書いて解説しています。

正規表現は、文字列の検索や置換に幅広く活用できるので、慣れるまで少し時間がかかるかもしれませんが、ぜひ知っておきましょう。

 

なお本記事は、TechAcademyのJava講座の内容をもとに作成しています。

 

田島悠介

今回は、Javaでの正規表現について勉強しよう。

大石ゆかり

田島メンター!正規表現というのは何ですか〜?

田島悠介

文字列をひとつのパターンで表すものなんだ。どういう目的で使われるのか、具体的な例を見るとよく分かると思うよ。さっそく使ってみよう。

大石ゆかり

はい!

正規表現とは

正規表現は文字列の集合(パターン)を表す記法です。

特にプログラミングでは、以下のような用途で正規表現を用います。

  • 特定のパターンにマッチする文字列を検索する。
  • マッチした文字列を別の文字列に置き換える。

 

正規表現の書き方

正規表現の文法

たとえば「ab+c」という正規表現があります。

「+」という記号は「1回以上の繰り返し」をあらわします。

従って、これは「a」「b 1回以上」「c」という文字列にマッチします。

  • マッチする例
    • abc
    • abbc
    • abbbc
  • マッチしない例
    • ac
    • abb
    • bbc

詳細は公式のリファレンスを参照してください。

 

Javaでの正規表現の記述方法

  1. 正規表現パターンをコンパイルし、Patternオブジェクトを生成します。
  2. 正規表現を適用したい文字列を渡し、Matcherオブジェクトを生成します。
  3. Matcherにより、検索・置換・分割を行います。

具体的なソースコードは以下の通りです。

Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();

この場合、パターン「a*b」に、文字列「aaaaab」がマッチします。 従ってboolean bの値は「true」になります。

 

文字列へのマッチ方法

Matcherでよく使うのは以下3つの操作です。ケースに応じて使い分けます。

  • findメソッドは、入力文字列を走査して、パターンとマッチする次の部分文字列を検索します。
  • matchesメソッドは、入力文字列全体とパターンをマッチします。
  • lookingAtメソッドは、入力文字列の先頭から始めてパターンをマッチします。

 

田島悠介

正規表現についての基本説明になるよ。

大石ゆかり

なるほど、「条件に合ってるものだったらすべてOK」という感じになるんですね。

田島悠介

次に、実際に正規表現を使ってコードを書いた例を見てみよう。

[PR] Javaで挫折しない学習方法を動画で公開中

実際に書いてみよう

このプログラムでは正規表現「ab+c」を用います。マッチ方法にはfindメソッドを用います。

与えられた文字列がマッチした場合、マッチした部分の開始位置と終了位置を表示します。

 

ソースコード

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Regex0 {
  public static void main(String[] args) {
    String [] texts = {"abc", "xabbcx", "ac", "bbc"};
    for(String text: texts){
      patternMatch(text);
    }
  }
  
  private static void patternMatch(String text) {
    Pattern pattern = Pattern.compile("ab+c");
    Matcher matcher = pattern.matcher(text);
    if(matcher.find()) {
      int start = matcher.start();
      int end = matcher.end();
      System.out.println("文字列 " + text + " はマッチしました。");
      System.out.println("開始位置:" + start + ", 終了位置: " + end);
    }
    else {
      System.out.println("文字列 " + text + " はマッチしませんでした。");
    }
  }
}

 

実行結果

文字列 abc はマッチしました。
開始位置:0, 終了位置: 3
文字列 xabbcx はマッチしました。
開始位置:1, 終了位置: 5
文字列 ac はマッチしませんでした。
文字列 bbc はマッチしませんでした。

 

解説

15行目でPatternオブジェクトをコンパイルしています。

「ab+c」という正規表現なので、「a」「b 1回以上」「c」という文字列の並びにマッチします。

文字列「abc」に対して、マッチします。開始位置0、終了位置3という結果を出力します。

また、findメソッドのため、文字列「xabbcx」に対してもマッチしますが、文字列「ac」「bbc」に対しては、マッチしません。

 

まとめ

正規表現を活用することで、大量の文書からメールアドレスを抽出したり、ユーザの入力した電話番号が正しい形式か判定したりできます。

文字列を検索したり置換したりするようなケースでは、正規表現を活用できないか考えてみると良いでしょう。

入門向けJavaの学習サイトもまとめているので、合わせてご覧ください。

 

田島悠介

正規表現を使って条件分岐を行った場合の書き方だね。

大石ゆかり

指定した「ab+c」の条件に合うものとそうでないものとで処理を分けることができるということですね。

田島悠介

そうだね。正規表現をうまく使うことであいまいな表記揺れなどにも対応できるんだ。ぜひ覚えておこう。

大石ゆかり

分かりました。ありがとうございます!

また、オンラインのプログラミングスクールTechAcademyでは、Java講座を開催しています。

JavaやServletの技術を使ってWebアプリケーションの開発を学ぶことができます。

現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、最短4週間で習得することが可能です。