バナー画像

Javaの学習や実装をしているときに「特定の文字列が含まれているか知りたい」「完全一致しているか確認したい」という場合がありませんか?

この記事では、Javaで文字列を検索するさまざまな方法をまとめて解説します。

目的に合わせた手法で、文字列の検索ができるようになってください!

javaで文字列を検索する7つの方法

Javaで文字列を検索する方法には、以下の7通りがあります。

  1. indexOfメソッドで文字列を検索
  2. lastIndexOfメソッドで後方から文字列を検索
  3. containsメソッドで文字列を検索
  4. matchesメソッドで正規表現を使って文字列を検索
  5. startsWithメソッドで文字列の前方一致を検索
  6. endsWithメソッドで文字列の後方一致を検索
  7. equalsメソッドで文字列が完全一致しているものを検索

ひとつずつ解説しますね。

1.indexOfメソッドで文字列を検索

ある文字列の中に指定した文字列が含まれているかを確認するには、indexOfメソッドが利用できます。

indexOfメソッドには、以下の4通りの使い方が可能です。

  1. indexOf(int ch)
  2. indexOf(int ch, int fromIndex)
  3. indexOf(String str)
  4. 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で文字列を検索する方法をまとめて紹介しました。

文字列の検索方法は、用途によってさまざまな手法があります。

自分が検索したい方法はどのメソッドを用いればよいのか、ぜひこの記事を参考に実装してみてください。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。