【Java】正規表現の使い方(判定、抽出、置換)

当ページのリンクには広告が含まれています。

単純な一致判定(完全一致、部分一致、前方一致、後方一致)のみであれば、【Java】文字列の完全一致と部分一致を判定する方法を参照して見て下さい。

抽出、置換、判定を繰り返し処理で行う場合は当記事を参照ください。

目次

判定

以下が基本的な判定の手順です。
・正規表現を指定する。
・チェック対象文字列のMatcherを生成する。
・マッチするか実行する。

matches()

チェック対象文字列全体に対して一致しているかを判定します。

■出力結果
マッチしました。

find()

チェック対象文字列全体に正規表現の一致箇所を順次判定します。

■出力結果
abc
def

 

抽出

抽出する場合、正規表現内に()で抽出箇所を明示的に示し、group()メソッドで抽出します。
()の数がgroup()メソッドのインデックスに当てはまります。

正規表現が「([a-z])_([A-Z])_([0-9])」である場合、以下のようにindexが割り当てられます。
([a-z]):index=1
([A-Z]):index=2
([0-9]):index=3
つまり、([a-z])の部分を抽出するには group(1) とします。

ただし、index=0は全体を表すので、group(0)とgroup()は等価になります。
部分の抽出はindex=1から始まることに注意して下さい。

■出力結果
group() = : abc_XYZ_012
group(0) = : abc_XYZ_012
group(1) = : abc
group(2) = : XYZ
group(3) = : 012

 

置換

置換で使うことができるメソッドは主に4つあります。

全置換(replaceAll)

文字列全体に対して一致する箇所全てを置換します。

■出力結果
one dog two dogs.

部分置換(appendReplacement)

appendReplacementは全置換する過程で個別処理を差し込みたいケースで活用できます。
appendReplacementで全置換することもできますが、全置換であればreplaceAllの方が単純です。

また、appendReplacementはappendTailとセットで使う点に注意して下さい。
以下のコード例では、2回目の出現箇所のみ置換するようにしています。

■出力結果
one cat two dogs.

最初に一致した文字だけ置換(replaceFirst)

最初に一致した部分だけを置換するにはreplaceFirstを使用します。

■出力結果
First A, second a.

エスケープ文字を含む置換(quoteReplacement)

エスケープを含む文字の置換ではquoteReplacementを使用します。

以下のコード例では「slash」を「\」に置換しています。
quoteReplacementを使用すると置換に成功しますが(1)、使用しないとIllegalArgumentExceptionがthrowされます(2)。

■出力結果(1)
This is \.■出力結果(2)
Exception in thread “main” java.lang.IllegalArgumentException: character to be escaped is missing

 

チェッカーツール

Web上で公開されているJava用の正規表現チェッカーツールを紹介します。
Regular Expression Test Drivefor Java Developer

使い方は簡単で直感的です。
また、Patternのフラグ設定も可能になっているので、詳細な指定をしたい方はそれらを使用することもできます。

 

よく使う正規表現一覧

正規表現説明
.任意の1文字(行末記号とマッチする場合もある)
\d数字: [0-9]
\s空白文字
\w英数字: [a-zA-Z_0-9]
[a-zA-Z]a - zまたはA - Z (範囲指定)
[^abc]a、b、c以外の文字(否定)
\tタブ文字
\n改行文字
\rキャリッジ・リターン文字
\\バックスラッシュ文字
^行の先頭
$行の末尾
\nマッチしたn番目の前方参照を行う正規表現グループ

更に詳細を確認したい場合は、PatternクラスのAPIドキュメントが参考になります。
【Java Doc】Patternクラス

 

String.matches v.s. Matcher.matches

単純な一致判定であればString.matchesを使うこともできます。
【Java】文字列の完全一致と部分一致を判定する方法

しかし抽出、置換を行いたいのであればPattern/Matacherを使うことをお薦めします。

また、一致判定であっても何度も繰り返す場合、性能的にはPattern/Matacherの方が速くなります。
こちらの記事が参考になります。
What’s the difference between String.matches and Matcher.matches?

実装する用途に応じて使い分けるようにしましょう。

まとめ

  • 判定にはmatchesとfindがある。
  • 抽出は()で抽出箇所を指定して、group()メソッドで取得する。
  • 置換には全置換、部分置換、最初に一致した文字の置換、エスケープ文字の置換ができる。
  • 繰り返し処理で判定をする場合、String.matchesよりもMatcher.matchesの方が性能が良い。

参考情報

【Java Doc】Matcherクラス
【Java Doc】Patternクラス
【Java】文字列の完全一致と部分一致を判定する方法

最後までお読み頂き、ありがとうございました!
ご意見・ご要望がありましたら、遠慮なくコメント下さい!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

リーマンショックの影響で26歳の時にIT業界から離れ、紆余曲折を経て34歳でエンジニアに復帰しました。
復帰前は開発未経験でしたが、独学した知識と面接時のコミュニケーション力で見事開発エンジニアとして復帰しました!
今はフリーランスエンジニアとして仕事をしています。

■保有資格
・Java Gold SE 11

コメント

コメントする

CAPTCHA


目次