Gradleとは何者?インストール方法〜使い方までわかりやすく解説
Javaのプログラミング学習をするうえで、「replaceAllの使い方がわからない」と悩んでいる方も多いのではないでしょうか。
「replaceAllで文字列を置換するやり方は?」
「正規表現はどうやって書くのだろうか?」
といった疑問に対して、本記事ではJavaのreplaceAllの使い方をサンプルを交えて解説していきます。
※本記事で紹介するサンプルコードは、macOS Montere、OpenJDK-11.0.13で動作確認しています。
1.JavaのreplaceAllとは?
JavaのreplaceAllメソッドは、文字列を検索して条件に一致する部分をすべて置換する機能を持っています。
書式は以下のとおりです。
public String replaceAll(String regex, String replacement)
・regex:一致条件として指定する文字列・正規表現
・replacement:一致するものそれぞれに置換する文字列
2.replaceAllの基本的な使い方
replaceAllメソッドの基本的な使い方について、サンプルコードと共に解説していきます。
①文字列を一括置換する
replaceAllメソッドを使用し、文字列を一括置換するサンプルを紹介します。
public class App {
public static void main(String[] args) {
String str = "ABCabcABC";
str = str.replaceAll("abc", "XY");
System.out.println(str);
}
}
実行結果:
ABCXYABC
実行結果を確認すると、文字列の”abc”の箇所が”XY”に置き換わっていることがわかりますね。
②正規表現を使って一括置換する
正規表現とは、文字列の中の「パターン」を表現する記述方法です。replaceAllは正規表現を使ってパターンとマッチした文字列を、指定した文字列へ一括置換できます。
正規表現を使って一括置換するサンプルを紹介します。
public class App {
public static void main(String[] args) {
String str = "ABCabcABCdeABCf";
str = str.replaceAll("[a-z]", "X");
System.out.println(str);
}
}
実行結果:
ABCXXXABCXXABCX
replaceAllの最初の引数[a-z]は、”英小文字にマッチするか”を表す正規表現です。
実行結果を確認すると、文字列”ABCabcABCdeABCf”の小文字部分が、すべて”X”に置き換わっていることがわかります。
よく使う正規表現
よく使う正規表現を紹介します。
正規表現 | 意味 | 表現例 | 合致する文字列の例 |
* | 0回以上繰り返し | a* | ␣,a,aa,aaa |
+ | 1回以上繰り返し | ab+ | ab,abab,ababab |
? | 0回 or 1回繰り返し | ba? | ␣,ba |
^ | 直後の文字が行の先頭にある場合にマッチ | ^Java | Java Programming |
$ | 直前の文字が行の末尾にある場合にマッチ | Programing$ | Java Programming |
{N} | N回繰り返し | (abc){3} | abcabcabc |
{M,N} | M回以上N回以下繰り返し | a{2,4} | aa,aaa,aaaa |
[A-Z] | 英大文字A-Zの任意1文字にマッチ | a[A-Z] | aA,aB,aX,aY |
[a-z] | 英小文字a-zの任意1文字にマッチ | b[a-z] | ba,bc,bx,by,bz |
[0-9] | 数字0-9の任意1文字にマッチする | c[0-9] | c1,c9,c0 |
特殊文字の無効化(エスケープ)
正規表現では*、?、{}、[]など、いくつかの文字を特別な意味として用います。これらの特殊文字を正規表現のパターンで指定したい場合は「\(バックスラッシュ)」を使って無効化(エスケープ)します。
まずは、エスケープしないコードを確認しましょう。
public class App {
public static void main(String[] args) {
String str = "Javaではクラスの最初と最後に{}を書きます。";
str = str.replaceAll("{}", "中括弧");
System.out.println(str);
}
}
実行結果:
Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal repetition
このように、エスケープしない書き方をすると、実行時にPatternSyntaxExceptionが発生します。
次にエスケープするコードを確認しましょう。
public class App {
public static void main(String[] args) {
String str = "Javaではクラスの最初と最後に{}を書きます。";
str = str.replaceAll("\\{\\}", "中括弧");
System.out.println(str);
}
}
実行結果:
Javaではクラスの最初と最後に中括弧を書きます。
このように、”{”や ” }”を置換する場合は\\でエスケープしましょう。
3.replaceAllの応用的な使い方
ここでは空白の削除やマッチした文字列の参照など、replaceAllメソッドの応用的な使い方を紹介します。
①空白の削除
replaceAllメソッドは空白削除にも使えます。第二引数をブランク(長さ0の文字列)にすれば、空白削除と同じ意味になります。
public class App {
public static void main(String[] args) {
String str = "Learn\t Java\n programming";
str = str.replaceAll("\\s+", "");
System.out.println(str);
}
}
実行結果:
LearnJavaprogramming
第一引数に” \\s+”を指定すると、空白を検索します。タブコード(\t)や改行コード(\n)も同時に検索されます。
②マッチした文字列の参照
第一引数で、”()”で囲んだ部分を”$ + 数値”形式で参照できます。
以下にサンプルを記載します。
public class App {
public static void main(String[] args) {
String str = "1,115.90";
str = str.replaceAll("([0-9]+),([0-9]+.[0-9]+)", "$1ドル=$2円");
System.out.println(str);
}
}
実行結果:
1ドル=115.90円
正規表現内で()により囲まれた部分を順番に参照できます。$1で最初にマッチした1を置換し、$2で2番目にマッチした115.90を置換したことが確認できますね。
4.さまざまな文字列置換方法
JavaにはreplaceAllメソッド以外にも文字列を置換するメソッドが存在しています。
以下に各メソッドとその特徴を記載します。
メソッド名 | 特徴 |
replace | 文字列の一部を別の文字列に置換する |
replaceAll | 文字列を検索して条件に一致する部分をすべて置換する |
replaceFirst | 文字列を検索して最初に一致した部分のみ置換する |
①文字列の一部を置換するなら:replace
replaceは文字列の一部を別の文字列に置換するメソッドです。
以下は、電話番号のハイフンを抜くサンプルコードです。
public static void main(String[] args) {
String str = "090-1234-5678";
str = str.replace("-", "");
System.out.println(str);
}
実行結果:
09012345678
実行結果からハイフンが抜かれたことが確認できます。
このように、単純に文字列を置換するならreplaceメソッドがおすすめです。
②条件に一致する文字列をすべて置換するなら:replaceAll
replaceAllは文字列を検索し、条件に一致する部分をすべて置換するメソッドです。
以下のコードは、単語間の連続する複数の半角スペースをひとつに置換するサンプルです。
public class App {
public static void main(String[] args) {
String str = "Learn about Java's replaceAll method";
str = str.replaceAll("[ ]+", " ");
System.out.println(str);
}
}
実行結果:
Learn about Java's replaceAll method
実行結果から、単語間の半角スペースがひとつになったのが確認できますね。
replaceAllメソッドは正規表現を使えるため、複数文字を置換できるので便利です。
③最初のひとつだけ置換するなら:replaceFirst
replaceFirstは、文字列を検索し最初に一致した部分を置換するメソッドです。
以下のサンプルコードは、文字列中にある最初のnullを「8:00」に置換します。
public static void main(String[] args) {
String str = "2022/2/16,水,null,null";
str = str.replaceFirst("null", "8:00");
System.out.println(str);
}
実行結果:
2022/2/16,水,8:00,null
実行結果から、最初のnullだけが「8:00」に置換されているのが確認できます。