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

- システム
エンジニア - Javaでの正規表現を使うと効率化できそうですね。
- プロジェクト
マネージャー - 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文字の文字列」を検索するコードを使用し、利用方法を確認してみましょう。
サンプルコード
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public class Main {
public static void main(String[] args) {
// 検索元の文字列
String name1 = "さとう";
String name2 = "たなか";
String name3 = "さいとう";
String name4 = "たかはし";
// 文字列の先頭が"さ"または""た""で始まる3文字であるかを確認する
System.out.println("name1:" + name1.matches("(さ|た).."));
System.out.println("name2:" + name2.matches("(さ|た).."));
System.out.println("name3:" + name3.matches("(さ|た).."));
System.out.println("name4:" + name4.matches("(さ|た).."));
}
}
|
実行結果
1
|
name1:truename2:truename3:falsename4:false
|
このように、文字数が4文字の””さいとう””や””たかはし””ではfalseを返しています。文字数を指定しない場合や、文字列内のどこかに含まれているかどうかを確認したい場合は、正規表現を下記のように変更します
1
2
3
4
|
//先頭が""さ""または""た""で始まる文字列であるかを確認する
System.out.println("name1:" + name1.matches("(さ|た).*"));
// 文字列のどこかに""さ""または"た"が含まれているかを確認する
System.out.println("name1:" + name1.matches(".*(さ|た).*"));
|
文字列の検索を行う
文字列のいずれかの部分に一致するパターンがあるかを検索したい場合、つまり部分一致を検索したい場合には、JavaではMatcherクラスのfindメソッドを利用します。この際、以下の2つのクラスをインポートしておく記述が必要となります。
・java.util.regex.Matcher・java.util.regex.Patternでは、文字列の中に「アルファベットが1文字含まれているか」、「2文字の連続するアルファベットが含まれているか」を確認するサンプルコードを見てみましょう。
サンプルコード
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
// 検索元の文字列
String str = "あ1aい2bう3c";
// 正規表現のパターンを作成 // パターン1:1文字のアルファベットが含まれているかを確認する
Pattern p1 = Pattern.compile("[a-z]");
Matcher m1 = p1.matcher(str);
// パターン2:2文字の連続するアルファベットが含まれているかを確認する
Pattern p2 = Pattern.compile("[a-z]{2}");
Matcher m2 = p2.matcher(str);
System.out.println("strをパターン1で検索:" + m1.find());
System.out.println("strをパターン2で検索:" + m2.find());
}
}
|
実行結果
1
2
|
strをパターン1で検索:true
strをパターン2で検索:false
|
これは”あ1aい2bう3c”と言う文字列を、指定したパターンで検索しているコードです。検索元となる文字列の中に、2文字以上連続しているアルファベットは存在していないため、[a-z]で検索した場合はtrue、[a-z]{2}で検索した場合はfalseを返しています。
文字列の置換を行う
文字列の中にある特定の文字を違う文字に置き換えたい場合、つまり置換を行いたい場合は、JavaではMatcherクラスのreplaceAllメソッド、またはreplaceFirstメソッドを利用することになります。replaceAllメソッドは「マッチした文字列を全て入れ替える」のに対し、replaceFirstメソッドは「最初にマッチした文字列のみを入れ替える」という処理を行います。それでは実際にreplaceAllとeplaceFirstを利用したサンプルコードを見ていきましょう。
サンプルコード
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
// 置換元の文字列
String str = "12345 abcdf 12345 abcdf";
// 正規表現のパターンを定義
Pattern patAlfa = Pattern.compile("[a-z]+");
Matcher matAlfa = patAlfa.matcher(str);
Pattern patNum = Pattern.compile("[0-9]+");
Matcher matNum = patNum.matcher(str);
System.out.println("strをpatAlfaで検索して置換:" + matAlfa.replaceAll("efghi"));
System.out.println("strをpatNumで検索して置換:" + matNum.replaceFirst("67890"));
}
}
|
実行結果
1
2
|
strをpatAlfaで検索して置換:12345 efghi 12345 efghi
strをpatNumで検索して置換:67890 abcdf12345 abcdf
|
“[a-z]+”は「任意の文字数のアルファベット」、””[0-9]+””は「任意の文字数の数字」を表しています。replaceAllで検索した場合はマッチした文字列が全て指定した文字列に置き換えられているのに対し、replaceFirstでは最初にマッチした文字列のみが置き換えられています。
- システム
エンジニア - Javaでの正規表現はさまざまな利用方法があるのですね。
- プロジェクト
マネージャー - そうですね。方法を理解すれば、他のプログラミング言語にも応用できるので便利ですよ。
まとめ
正規表現は、上手く利用すれば非常に便利な機能です。一見難しそうに見えますが、基本さえわかってしまえばすぐに覚えることが出来るでしょう。まずは、ご紹介した基本的なものから利用してみてください。正規表現は一度覚えてしまえば他の言語でもほとんど同じ表現で利用することが出来ます。プログラミングの上達のためにも、どんどん活用していきましょう。
FEnetJava・Javaコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


Java新着案件New Job
-
官公庁向け業務システム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給39万~44万円東京都千代田区(永田町駅) -
販売管理システム開発/Java/東京都中央区/【WEB面談可】/テレワーク
月給49万~55万円東京都中央区(京橋駅) -
生命保険会社向けシステム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給42万~48万円東京都千代田区(大手町駅) -
社会保険システムのパッケージ開発/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(新橋駅) -
金融機関向けシステム更改/Java/東京都江東区/【WEB面談可】/テレワーク
月給46万~51万円東京都江東区(豊洲駅) -
大手通信会社者向けWebシステム改修/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(品川駅)