Javaコラム Javaエンジニアのためのお役立ちコラム

Java

Javaでの正規表現の使い方!文字列検索や置換のためのメソッドも紹介

2020年05月15日

SE
Javaでの正規表現を使うと効率化できそうですね。

PM
1つの文字列で複数の文字列を検索できるので、使い方をマスターすれば便利に仕事ができるはずです。

正規表現とは?

正規表現とは、プログラミング言語やテキストエディタにて文字列の検索、置換を行う際に利用される表現方法のことです。1つの文字列で複数のパターンを検索したいときなどに利用されます。例えば、人物のリストから「””さ””、または””た””から始まる3文字の名字」を検索したい場合、以下のようにします。(さ|た)..この文字列を使用して検索すると、「さとう」や「たなか」と言った名字がヒットします。逆に、「さいとう」や「たかはし」と言った名字はヒットしません。このように、正規表現を利用すれば1つの文字列で複数の文字列を検索することが出来るようになるのです。

メタ文字とは?

メタ文字(メタキャラクタ)とは、プログラム上で特別な意味を持たせた文字の事です。本来の意味とは異なる使い方をされる文字がこのように呼ばれます。正規表現ではピリオド「.」は「文章の終わり、句点」という意味ではなく、「任意の1文字」と言う意味を持ちます。そのため、「あいう」という文字列を「.」で検索すると、それぞれ「あ」と「い」と「う」がヒットします。このように、本来の意味とは別の利用法をされる文字のことを、メタ文字(メタキャラクタ)と呼びます。

Javaで利用されるメタ文字

メタ文字は、利用するプログラミング言語やテキストエディタで異なる場合があります。また、利用できるメタ文字も多く存在しています。今回は、Javaで利用できるメタ文字について、基本的なものをご紹介します。
記号の説明使用例の結果

. 任意の1文字 a.. “abc”など、aから始まる3文字
? 0または1回 a? “a”または”aa”
+ 1回以上 a+ “aa””または”aaa”など、直前の文字を1回以上繰り返した文字列
* 0回以上 a* “a”または”aa”など、直前の文字を0回以上繰り返した文字列
[] []内のいずれかの文字 [abc]または[a-c] “a”または”b”または”c”
[^] []内以外の文字 [^abc]または[^a-c] “a””、””b””、””c””以外の1文字
{n} n回 a{1} “a”
{n,} n回以上 a{1,} “a”または”aa”など、直前の文字を1回以上繰り返した文字列
{,n} n回以下 a{,2} “a”または”aa”など、直前の文字を2回以下繰り返した文字列
{n,m} n回以上、m回未満 a{1,3} “a”または”aaa”など、直前の文字を1回以上3回以下繰り返した文字列
| …または… a|1 “a”または”1″のどちらか
() ()内をグループ化 (a|1|あ) “a”または”1″または”あ”のいずれか
^ 文頭 ^a “”abc””など、aから始まる文字列
$ 文末 a$ “”cba””など、aで終わる文字列

以上が基本的なメタ文字になります。Javaで利用できるもっと複雑なメタ文字を知りたい場合はJavaDocを参照してください。書かれている内容は少々複雑ですので、最初のうちは実際にプログラミングで利用しながら覚えていくことをおすすめします。

Javaでの正規表現の利用方法

Javaで正規表現を使うのは、文字列の検索、置換を行う場合です。Stringクラスのmatchesメソッドや、 Patternクラスのcompileメソッドなどで利用することが可能です。それでは、実際にサンプルコードを見ながらJavaでの正規表現の使い方を確認しましょう。

文字列の全体が一致しているかチェックする

正規表現で指定したパターンと文字列の全体が一致するかを確認する場合、JavaではStringクラスのmatchesメソッドを利用します。matchesメソッドは、Stringクラスの文字列全てと完全一致する場合にTrueを返します。そのため、基本的には文字数も一致させる必要があります。実際に、「””さ””、または””た””から始まる3文字の文字列」を検索するコードを使用し、利用方法を確認してみましょう。

サンプルコード

実行結果

このように、文字数が4文字の””さいとう””や””たかはし””ではfalseを返しています。文字数を指定しない場合や、文字列内のどこかに含まれているかどうかを確認したい場合は、正規表現を下記のように変更します

文字列の検索を行う

文字列のいずれかの部分に一致するパターンがあるかを検索したい場合、つまり部分一致を検索したい場合には、JavaではMatcherクラスのfindメソッドを利用します。この際、以下の2つのクラスをインポートしておく記述が必要となります。

・java.util.regex.Matcher・java.util.regex.Patternでは、文字列の中に「アルファベットが1文字含まれているか」、「2文字の連続するアルファベットが含まれているか」を確認するサンプルコードを見てみましょう。

サンプルコード

実行結果

これは”あ1aい2bう3c”と言う文字列を、指定したパターンで検索しているコードです。検索元となる文字列の中に、2文字以上連続しているアルファベットは存在していないため、[a-z]で検索した場合はtrue、[a-z]{2}で検索した場合はfalseを返しています。

文字列の置換を行う

文字列の中にある特定の文字を違う文字に置き換えたい場合、つまり置換を行いたい場合は、JavaではMatcherクラスのreplaceAllメソッド、またはreplaceFirstメソッドを利用することになります。replaceAllメソッドは「マッチした文字列を全て入れ替える」のに対し、replaceFirstメソッドは「最初にマッチした文字列のみを入れ替える」という処理を行います。それでは実際にreplaceAllとeplaceFirstを利用したサンプルコードを見ていきましょう。

サンプルコード

実行結果

“[a-z]+”は「任意の文字数のアルファベット」、””[0-9]+””は「任意の文字数の数字」を表しています。replaceAllで検索した場合はマッチした文字列が全て指定した文字列に置き換えられているのに対し、replaceFirstでは最初にマッチした文字列のみが置き換えられています。

SE
Javaでの正規表現はさまざまな利用方法があるのですね。

PM
そうですね。方法を理解すれば、他のプログラミング言語にも応用できるので便利ですよ。

まとめ

正規表現は、上手く利用すれば非常に便利な機能です。一見難しそうに見えますが、基本さえわかってしまえばすぐに覚えることが出来るでしょう。まずは、ご紹介した基本的なものから利用してみてください。正規表現は一度覚えてしまえば他の言語でもほとんど同じ表現で利用することが出来ます。プログラミングの上達のためにも、どんどん活用していきましょう。


Javaでのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

recommended

Categories

Tags