Javaの学習や実装をしているときに「特定の文字列が含まれているか知りたい」「完全一致しているか確認したい」という場合がありませんか?
この記事では、Javaで文字列を検索するさまざまな方法をまとめて解説します。
目的に合わせた手法で、文字列の検索ができるようになってください!
javaで文字列を検索する7つの方法
Javaで文字列を検索する方法には、以下の7通りがあります。
- indexOfメソッドで文字列を検索
- lastIndexOfメソッドで後方から文字列を検索
- containsメソッドで文字列を検索
- matchesメソッドで正規表現を使って文字列を検索
- startsWithメソッドで文字列の前方一致を検索
- endsWithメソッドで文字列の後方一致を検索
- equalsメソッドで文字列が完全一致しているものを検索
ひとつずつ解説しますね。
1.indexOfメソッドで文字列を検索
ある文字列の中に指定した文字列が含まれているかを確認するには、indexOfメソッドが利用できます。
indexOfメソッドには、以下の4通りの使い方が可能です。
- indexOf(int ch)
- indexOf(int ch, int fromIndex)
- indexOf(String str)
- indexOf(String str, int fromIndex)
indexOfメソッドはint型のメソッドのため、先頭を0として数えた場合の要素数(番号)を返します。
また、検索用法は「char型」と「String型」の2種類です。
第二引数に「int fromIndex」を指定すると、指定した要素数以降から指定した文字列の検索をしてくれます。
これら4通りの使い方で、実際に文字列を検索するサンプルコードを見てみましょう。
public class string_indexof { public static void main(String[] args) { // 検索対象の文字列 String sample = "ポテパンでjavaの文字列検索を!ポテパンと一緒に学ぼう!"; // indexOf(int ch)で、文字「!」が存在するかを検索 int ch = sample.indexOf('!'); System.out.println("indexOf(int ch)で「!」の検索結果:" + ch); // indexOf(int ch, int fromIndex)で、文字「!」が存在するかを検索 ch = sample.indexOf('!', 20); System.out.println("indexOf(int ch, int fromIndex)で「!」の検索結果:" + ch); // indexOf(String str)で、文字列「ポテパン」が存在するかを検索 ch = sample.indexOf("ポテパン"); System.out.println("indexOf(String str)で「ポテパン」の検索結果:" + ch); // indexOf(String str, int fromIndex)で、文字列「ポテパン」が存在するかを検索 ch = sample.indexOf("ポテパン", 15); System.out.println("indexOf(String str, int fromIndex)で「ポテパン」の検索結果:" + ch); } }
実行結果↓
indexOf(int ch)で「!」の検索結果:16 indexOf(int ch, int fromIndex)で「!」の検索結果:28 indexOf(String str)で「ポテパン」の検索結果:0 indexOf(String str, int fromIndex)で「ポテパン」の検索結果:17
fromIndexを指定した場合とそうでない場合で、検索結果が異なっているのがわかります。
indexOfメソッドの使い方は、以下のJavaリファレンスからも確認可能です。
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/String.html
2.lastIndexOfメソッドで後方から文字列を検索
lastIndexOfメソッドを利用すれば、文字列を末尾から検索するのも可能です。
サンプルコードで動きを確認してみましょう。
public class string_lastIndexOf { public static void main(String[] args) { // 検索対象の文字列 String sample = "ポテパンでjavaの文字列検索を!ポテパンと一緒に学ぼう!"; int ch = sample.indexOf("ポテパン"); System.out.println("indexOfで「ポテパン」の検索結果:" + ch); ch = sample.lastIndexOf("ポテパン"); System.out.println("lastIndexOfで「ポテパン」の検索結果:" + ch); } }
実行結果↓
indexOfで「ポテパン」の検索結果:0 lastIndexOfで「ポテパン」の検索結果:17
indexOfとは異なり、末尾から検索できています。
後ろから検索をかけたい場合に有効活用しましょう!
3.containsメソッドで文字列を検索
containsはboolean型のメソッドで、特定の文字列が含まれているかを「true」または「false」を返して確認できます。
Javaのbooleanの使い方については、以下の記事で詳しく解説していますので参考までに。
【関連記事】
▶︎【初心者】Javaにおけるboolean(Boolean)の使い方【入門】
containsメソッドの使い方も、サンプルコードで確認しましょう。
public class string_contains { public static void main(String[] args) { // 検索対象の文字列 String sample = "ポテパンでjavaの文字列検索を!ポテパンと一緒に学ぼう!"; // 検索する文字列 String str = "ポテパン"; if (sample.contains(str)) { System.out.println("文字列に" + str + "が含まれています。"); } else { System.out.println("文字列に" + str + "が含まれていません。"); } } }
実行結果↓
文字列にポテパンが含まれています。
検索した文字列が含まれていた場合の処理が動いているのがわかります。
4.matchesメソッドで正規表現を使って文字列を検索
matchesメソッドは、containsメソッドと同じように特定の文字列が含まれているかを検索できます。
matchesメソッドは「正規表現」を使って文字列を調べるのが特徴です。
文字列のパターンから検索できるため、containsメソッドよりも幅広く検索をかけられます。
Javaの正規表現については、以下の記事で詳しく解説していますので参考までに。
【関連記事】
▶︎初心者でもわかる!Java正規表現の書き方【サンプルあり】
matchesメソッドを用いたサンプルコードを見ていきましょう。
public class string_matches { public static void main(String[] args) { // 検索対象の文字列 String sample1 = "ポテパンでjavaの文字列検索を!ポテパンと一緒に学ぼう!"; String sample2 = "ポテトでjavaの文字列検索を!ポテトと一緒に学ぼう!"; if (sample1.matches(".*ポテ.*")) { System.out.println("文字列に「ポテ」が含まれています。"); } else { System.out.println("文字列に「ポテ」が含まれていません。"); } if (sample2.matches(".*ポテ.*")) { System.out.println("文字列に「ポテ」が含まれています。"); } else { System.out.println("文字列に「ポテ」が含まれていません。"); } } }
matchesメソッドに「.*ポテ.*」を指定し、文字列に「ポテ」が含まれているかを確認します。
上記のプログラムを実行すると、以下の実行結果を得られます。
実行結果↓
文字列に「ポテ」が含まれています。 文字列に「ポテ」が含まれています。
5.startsWithメソッドで文字列の前方一致を検索
startsWithメソッドを使うと、文字列が前方一致しているかを検索できます。
startsWithメソッドを用いたサンプルコードを見ていきましょう。
public class string_startsWith { public static void main(String[] args) { // 検索対象の文字列 String sample1 = "ポテパンでjavaの文字列検索を一緒に学ぼう!"; String sample2 = "javaの文字列検索をポテパンと一緒に学ぼう!"; if (sample1.startsWith("ポテパン")) { System.out.println("「ポテパン」が前方一致しました。"); } else { System.out.println("「ポテパン」が前方一致しませんでした。"); } if (sample2.startsWith("ポテパン")) { System.out.println("「ポテパン」が前方一致しました。"); } else { System.out.println("「ポテパン」が前方一致しませんでした。"); } } }
実行結果↓
「ポテパン」が前方一致しました。 「ポテパン」が前方一致しませんでした。
6.endsWithメソッドで文字列の後方一致を検索
endsWithメソッドを使うと、文字列が後方一致しているかを検索できます。
startsWithメソッドとセットで覚えておくとよいでしょう。
endsWithメソッドを用いたサンプルコードを見ていきます。
public class string_endsWith { public static void main(String[] args) { // 検索対象の文字列 String sample1 = "ポテパンでjavaの文字列検索を一緒に学ぼう!"; String sample2 = "javaの文字列検索をポテパンと一緒に学ぼう"; if (sample1.endsWith("学ぼう")) { System.out.println("「学ぼう」が後方一致しました。"); } else { System.out.println("「学ぼう」が後方一致しませんでした。"); } if (sample2.endsWith("ポテパン")) { System.out.println("「学ぼう」が後方一致しました。"); } else { System.out.println("「学ぼう」が後方一致しませんでした。"); } } }
実行結果↓
「学ぼう」が後方一致しませんでした。 「学ぼう」が後方一致しました。
7.equalsメソッドで文字列が完全一致しているものを検索
equalsメソッドを使うと、文字列が完全一致しているかを検索できます。
今までの検索方法の中で、一番限定的な検索方法です。
equalsメソッドを用いたサンプルコードを見ていきます。
public class string_equals { public static void main(String[] args) { // 検索対象の文字列 String sample1 = "ポテパンでjavaの文字列検索"; String sample2 = "ポテパンでjavaの文字列検索!"; if (sample1.equals("ポテパンでjavaの文字列検索")) { System.out.println("完全一致しました。"); } else { System.out.println("完全一致しませんでした。"); } if (sample2.equals("ポテパンでjavaの文字列検索")) { System.out.println("完全一致しました。"); } else { System.out.println("完全一致しませんでした。"); } } }
実行結果↓
完全一致しました。 完全一致しませんでした。
文字列検索で処理速度が高速なのはどれ?
文字列の検索で、処理が高速な検索方法はどれなのでしょうか?
結論を言うとどの検索方法でも極端に速い、遅いということはありません。「文字列の一致」を調べる検索方法は比較的高速に処理します。
以下のコードで、処理速度を測ることが可能です。
public class string_indexof { public static void main(String[] args) { String[] str = new String[100]; for(int i=0; i<100; i++) { str[i] = "ポテパンでjavaの文字列検索を一緒に学ぼう"; } // indexOf検索処理開始 long start = System.nanoTime(); for(int i=0; i<100; i++) { int num = str[i].indexOf("ポテパン"); } // indexOf処理終了時間 long end = System.nanoTime(); System.out.println("indexOfの処理速度:" + (end - start) / 1000000f + "ms"); // contains検索処理開始 start = System.nanoTime(); for(int i=0; i<100; i++) { boolean b = str[i].contains("ポテパン"); } // contains処理終了時間 end = System.nanoTime(); System.out.println("containsの処理速度:" + (end - start) / 1000000f + "ms"); // matches検索処理開始 start = System.nanoTime(); for(int i=0; i<100; i++) { boolean b = str[i].matches("ポテパン"); } // matches処理終了時間 end = System.nanoTime(); System.out.println("matchesの処理速度:" + (end - start) / 1000000f + "ms"); // startsWith検索処理開始 start = System.nanoTime(); for(int i=0; i<100; i++) { boolean b = str[i].startsWith("ポテパン"); } // startsWith処理終了時間 end = System.nanoTime(); System.out.println("startsWithの処理速度:" + (end - start) / 1000000f + "ms"); // equals検索処理開始 start = System.nanoTime(); for(int i=0; i<100; i++) { boolean b = str[i].equals("ポテパンでjavaの文字列検索を一緒に学ぼう"); } // equals処理終了時間 end = System.nanoTime(); System.out.println("equalsの処理速度:" + (end - start) / 1000000f + "ms"); } }
実行結果↓
indexOfの処理速度:0.223096ms containsの処理速度:0.135004ms matchesの処理速度:1.668153ms startsWithの処理速度:0.054248ms equalsの処理速度:0.0083ms
「startsWithメソッド」「equalsメソッド」といった文字列の一致を見る検索方法は、処理が高速なのがわかります。
一方、matchメソッドのように文字列が含まれているかを見る検索方法は、文字列の一致を見る検索方法に比べて遅くなっていますね。
しかし、それほど極端に速度の違いは出ていません。
まとめ
Javaで文字列を検索する方法をまとめて紹介しました。
文字列の検索方法は、用途によってさまざまな手法があります。
自分が検索したい方法はどのメソッドを用いればよいのか、ぜひこの記事を参考に実装してみてください。