プログラミングをしていると、文字列を結合したい、文字列を抽出したいということがありますが、「どう記述するんだっけ」といつも調べている方はいないでしょうか。
僕もその一人で、決して全部を覚える必要はないと思っているのですが、調べるにも時間はかかるので一度まとめてみることにしました。
本記事では、Javaの文字列操作について、やりたい操作ごとにまとめてみました。
操作ごとにまとめているので、単なるメソッドの書き方だけでなく、該当するメソッドが直接ない場合にも、別の方法を含めて記載しています。
忘れた時に調べやすく、復習しやすいように心がけていますので、一人でも多くの方に役立てていただけたら幸いです。
なお、記載しているプログラムは、Java8を使って動作確認をしています。
Javaの文字列操作
必要な文字列操作として、以下の内容をとりあげます。
文字列を結合したい
最も単純なのは、+演算子で結合する方法です。
結合する対象が文字列であれば、数値と結合しても自動的に文字列に変換されます。
s1 = "Hello"; s2 = "Java"; r = s1 + s2; System.out.println(r); // -> HelloJava
s1 = "Hello"; s2 = "Java"; n = 1234; r = s1 + s2 + n; System.out.println(r); // -> HelloJava1234
concatを用いて、後方に文字列を結合していく方法もあります。
s1 = "Hello"; s2 = "Java"; r = s1.concat(s2); System.out.println(r); // -> HelloJava
分割された配列の中身を結合したい場合は、joinを使います。
joinの第1引数に文字列同士の間に含めたい文字列を指定し、第2引数に配列を指定します。
String[] a = {"Java", "Hello", "World"}; r = String.join(" ", a); System.out.println(r); // -> Java Hello World
formatを使って、文字列に埋め込むことで結合のようにすることもできます。
s1 = "Hello"; s2 = "Java"; r = String.format("%s %s!!", s1, s2); System.out.println(r); // -> Hello Java!!
StringBufferクラスやStringBuilderクラスを使って結合することもできます。
s1 = "Hello"; s2 = "Java"; StringBuilder builder = new StringBuilder(); builder.append(s1).append(s2); r = builder.toString(); System.out.println(r); // -> HelloJava
文字列を抽出したい
文字列から一部を抽出するには、substringを使います。
開始位置と終了位置を指定します。終了位置は省略することができます。
最初の文字はインデックス0から始まることに注意が必要です。
また、インデックスにマイナス値を指定することはできません。
s = "Hello Java!!"; r = s.substring(6, 10); System.out.println(r); // -> Java
文字列の長さを求めたい
文字列の長さを調べるには、lengthを使います。
s = "1234567890"; int rn = s.length(); System.out.println(rn); // -> 10
空文字であるかどうかは、isEmptyを使って判断することもできます。
s = ""; boolean rb = s.isEmpty(); System.out.println(rb); // -> true
文字列を検索したい
文字列の中に、特定の文字列を含んでいるかどうかを検索するには、contains、indexOf、matches、startsWith、endsWithを用いる方法があります。
containsは指定した文字列が含まれていればtrueを返し、含まれていなければfalseを返します。
s = "Hello Java!!"; rb = s.contains("Java"); System.out.println(rb); // -> true
indexOfは、文字列内に指定した文字列が最初に現れる位置のインデックスを返します。
後方から探す場合は、lastIndexOfを使います。
s = "Hello Java!!"; rn = s.indexOf("a"); System.out.println(rn); // -> 7
s = "Hello Java!!"; rn = s.lastIndexOf("a"); System.out.println(rn); // -> 9
matchesは正規表現を使って検索することができます。
s = "Hello Java!!"; rb = s.matches(".*Java.*"); System.out.println(rb); // -> true
startswithは、文字列の先頭に指定した文字列が存在した場合にTrueを返し、存在しない場合にはFalseを返します。
第2引数で開始位置を指定することも可能です。
s = "Hello Java!!"; rb = s.startsWith("Hello"); System.out.println(rb); // -> true
endswithは、文字列の末尾に指定した文字列が存在した場合にTrueを返し、存在しない場合にはFalseを返します。
s = "Hello Java!!"; rb = s.endsWith("!!"); System.out.println(rb); // -> true
文字列を置換したい
文字列の置換は、replaceを使います。
replaceは、見つかった文字列をすべて置換する文字列で置き換えます。
また、置換対象を正規表現で指定できるreplaceAllやreplaceFirstもあります。
s = "Hello Java??"; r = s.replace("?", "!"); System.out.println(r); // -> Hello Java!!
replaceAllは正規表現で見つかったすべての文字列を置換する文字列で置き換えます。
s = "Hello Java??"; r = s.replaceAll("\\?", "!"); System.out.println(r); // -> Hello Java!!
replaceFirstは正規表現で見つかった最初の文字列を置換する文字列で置き換えます。
s = "Hello Java??"; r = s.replaceFirst("\\?", "!"); System.out.println(r); // -> Hello Java!?
文字列を削除したい
Javaでは文字列を削除するための明示的なメソッドは用意されていません。
ですので、文字列の中から特定の文字列を削除(除去)するには、replaceを使って空文字に置き換える操作を行います。
s = "Hello Java!!"; r = s.replace("Hello ", ""); System.out.println(r); // -> Java!!
文字列を配列に分割したい
文字列を特定の文字で区切って配列にするには、splitを使います。
CSVやTSVの各要素を配列に分割するような場面でよく使われます。
第2引数で分割の制限数を指定することができます。
s = "JavaScript,Python,Java,Ruby,Go"; String[] rs = s.split(","); System.out.println(Arrays.toString(rs)); // -> [JavaScript, Python, Java, Ruby, Go]
文字列をトリミングしたい
文字列の中から前後の空白を削除(除去)するには、trimを用います。
s = " Hello Java!! "; r = s.trim(); System.out.println(r); // -> 「Hello Java!!」
文字列をパディングしたい
文字列の前後に何かの文字を付加することをパディング(詰め物)と呼びます。
Javaではパディングするための専用のメソッドは用意されていません。
そこで、formatによる書式指定を使って行います。
n = 123; r = String.format("%010d", n); System.out.println(r); // -> 0000000123
文字列を大文字・小文字に変換したい
文字列をすべて大文字に変換するには、toUpperCaseを使います。
s = "Java"; r = s.toUpperCase(); System.out.println(r); // -> JAVA
文字列をすべて小文字に変換するには、toLowerCaseを使います。
s = "Java"; r = s.toLowerCase(); System.out.println(r); // -> java
文字列を数値に変換したい
文字列を数値に変換するには、IntegerクラスのparseIntを使う方法とvalueOfを使う方法があります。
parseIntはint型で返しますが、valueOfはInteger型で返す違いがあります。
s = "123"; n = Integer.parseInt(s); System.out.println(n); // -> 123
s = "123"; Integer nn = Integer.valueOf(s); System.out.println(nn); // -> 123 System.out.println(nn instanceof Integer); // -> true
数値を文字列に変換したい
数値を文字列に変換するには、StringクラスのvalueOfを使います。
n = 123; r = String.valueOf(n); System.out.println(n); // -> 123 System.out.println(r instanceof String); // -> true
文字列が一致しているか確認したい
文字列同士が一致しているかどうかは、eqaulsを使う方法とcomparaToを使う方法があります。
eqaulsは文字列同士が一致している場合はtrue、一致しない場合はfalseを返します。
また、大文字小文字を区別せずに比較するeqaulsIgnoreCaseがあります。
s = "Java"; rb = s.equals("Java"); System.out.println(rb); // -> true
s = "Java"; rb = s.equalsIgnoreCase("java"); System.out.println(rb); // -> true
comparaToは辞書順に従って比較を行い、一致している場合は0、辞書順で前になる場合は負の値、辞書順で後になる場合は正の値を返します。
また、大文字小文字を区別しないcompareToIgnoreCaseもあります。
s = "Java"; rn = s.compareTo("Java"); System.out.println(rn); // -> 0
様々なメソッドを使いこなせるようになろう
実際の開発現場でも今回紹介した文字列操作はよく使われます。
どの言語でも文字列を操作するための便利な機能はたくさん用意されています。
これらをできるだけ使うことで、生産性の向上、ミスの削減、読みやすいコードへつなげることができ、プログラマーとしても成長することができます。
今回は、Javaの文字列操作についてまとめてみました。
参考になれば幸いです。
コメント