Java入門|文字列から文字の位置を探す方法

文字の場所が分かるようになると、文字列処理はもっと賢くなる

Javaで文字列を扱っていると、この文字はどこにあるのだろう、この記号は入っているのだろうか、という確認をしたくなる場面がよくあります。たとえば、メールアドレスに @ が入っているかを調べたいときや、文章の中に特定の文字が含まれているかを知りたいときです。こうした処理は、入力チェックや検索機能の基本としてとても大切です。

そんなときに活躍するのが、Stringクラスの indexOf() メソッドです。indexOf() を使うと、指定した文字や文字列がどこに現れるかを調べることができます。見つかったときはその位置が返され、見つからなかったときは特別な値が返されます。このしくみを理解すると、文字列の中身をただ表示するだけでなく、条件に応じて調べたり判断したりできるようになります。

ここでは、文字列の中から文字の位置を探す方法について、やさしく整理しながら見ていきます。あわせて、見つからなかった場合の扱い方や、位置を0から数えるという大切な考え方についても、しっかり確認していきましょう。

文字の位置を探すとはどういうことか

文字列は、文字が順番に並んだデータです。たとえば、さくらもち という文字列があったとします。この中に も という文字が入っているかを調べたい場合、ただ目で見るだけならすぐに分かりますが、プログラムではその位置を自分で探す必要があります。

そこで役立つのが indexOf() です。このメソッドは、指定した文字や文字列を探して、最初に見つかった位置を返してくれます。

たとえば、さくらもち の中で も を探すと、位置として 3 が返ります。Javaでは先頭の文字を 0 として数えるためです。

位置文字
0
1
2
3
4

このように、文字列検索は「その文字があるかどうか」だけでなく、「どこにあるか」を知るための処理でもあります。

indexOf() メソッドの役割

indexOf() メソッドは、指定した文字や文字列を検索し、最初に見つかった位置を返すメソッドです。

基本的な形は次のようになります。

文字列変数.indexOf(探したい文字)

または

文字列変数.indexOf(探したい文字列)

戻り値は int 型です。つまり、見つかった位置を整数で受け取ります。

このメソッドの大事な特徴は次の2つです。

特徴内容
見つかった場合最初に現れた位置を返す
見つからなかった場合-1 を返す

この -1 の意味をしっかり理解しておくと、検索結果に応じた条件分岐を書けるようになります。

シンプルなプログラムで見てみよう

ファイル名:Sample3.java

import java.io.*;

class Sample3
{
    public static void main(String[] args) throws IOException
    {
        // キーボード入力の準備をする
        BufferedReader br =
            new BufferedReader(new InputStreamReader(System.in));

        // 検索される文字列を入力してもらう
        System.out.println("言葉を入力してください。");
        String str1 = br.readLine();

        // 探したい文字を入力してもらう
        System.out.println("探したい1文字を入力してください。");
        String str2 = br.readLine();

        // 入力された先頭の1文字を取り出す
        char ch = str2.charAt(0);

        // 文字の位置を検索する
        int num = str1.indexOf(ch);

        // 結果を表示する
        if (num != -1)
            System.out.println(str1 + "の" + (num + 1) + "文字目に「" + ch + "」が見つかりました。");
        else
            System.out.println(str1 + "の中に「" + ch + "」は見つかりませんでした。");
    }
}

このプログラムでは、まず検索される文字列を入力し、そのあとで探したい1文字を入力しています。そして、indexOf() を使ってその文字の位置を調べています。

たとえば、次のように入力したとします。

言葉を入力してください。
たんぽぽ
探したい1文字を入力してください。
ぽ

このときの表示結果は次のようになります。

たんぽぽの4文字目に「ぽ」が見つかりました。

プログラムの流れを順番に整理しよう

このプログラムがどんな順番で動いているかを整理すると、かなり分かりやすくなります。

順番処理内容説明
1BufferedReader を作成するキーボード入力の準備をする
2str1 に文字列を入力する検索される対象を受け取る
3str2 に文字を入力する探したい内容を受け取る
4str2.charAt(0)入力された最初の1文字を取り出す
5str1.indexOf(ch)文字列の中から文字を探す
6if 文で判定する見つかったかどうかで表示を分ける

この流れを見ると、indexOf() だけでなく、これまで学んだ charAt() や if 文も組み合わさっていることが分かります。文字列処理は、1つのメソッドだけで完結するより、いくつかの基本を組み合わせて使うことが多いです。

indexOf() は最初に見つかった位置を返す

indexOf() の重要なポイントは、最初に見つかった位置を返すということです。

たとえば、文字列 こころここにあり の中で こ を探す場合を考えてみましょう。

位置文字
0
1
2
3
4
5
6
7

この文字列には こ が何回も出てきますが、indexOf('こ') の結果は 0 になります。なぜなら、一番最初に見つかった こ の位置を返すからです。

つまり、indexOf() は「最初の一致」を探すメソッドだと覚えておくとよいです。

見つからないときは -1 が返る

indexOf() はとても便利ですが、検索した文字が見つからないこともあります。そのときには -1 が返されます。

たとえば、すいか という文字列の中で め を探しても、その文字は入っていません。この場合、indexOf('め') の結果は -1 です。

このしくみがあるので、プログラムでは次のような判断ができます。

indexOf() の結果意味
0以上見つかった
-1見つからなかった

このルールを使えば、if 文で分岐できます。

if (num != -1)

この条件は、見つかったときの処理を行うためのものです。反対に、-1 のときは見つからなかったとして別のメッセージを表示できます。

なぜ num + 1 として表示しているのか

プログラムの中では、表示部分で num + 1 を使っていました。

System.out.println(str1 + "の" + (num + 1) + "文字目に「" + ch + "」が見つかりました。");

これは、Javaの位置が 0 から始まるためです。

たとえば、たんぽぽ の中で ぽ が見つかった位置は 3 ですが、人が普段読むときには 4文字目 と言ったほうが自然です。

この違いを整理すると、次のようになります。

Javaでの位置人がふつうに数える位置
01文字目
12文字目
23文字目
34文字目

つまり、プログラム内部では 0 から数え、表示では 1 から数えるように調整しているわけです。

charAt() と組み合わせている理由

このプログラムでは、検索する文字をそのまま indexOf() に渡すのではなく、いったん charAt(0) を使っています。

String str2 = br.readLine();
char ch = str2.charAt(0);

これは、キーボードからの入力が文字列として受け取られるからです。たとえ1文字だけ入力しても、readLine() の結果は String 型になります。

そのため、先頭の1文字を取り出して char 型に変え、それを indexOf() に渡しています。

この流れはとても自然で、これまで学んだ Stringクラスのメソッドがつながって使われている良い例です。

indexOf() のイメージを図でつかもう

この図は、文字列 たんぽぽ の中から ぽ を探している様子を表しています。中央にある文字列には位置番号がついていて、Javaでは先頭を 0 として数えることが分かるようになっています。検索文字の ぽ が、文字列の中の該当する文字に向かって示されており、その結果として indexOf(ぽ) が 3 を返す流れが見えるようになっています。

この図を見ると、indexOf() が文字そのものを返すのではなく、位置を返していることが理解しやすくなります。また、人が数える 4文字目 と、Javaの位置 3 の違いにも気づきやすくなります。

indexOf() を使うとどんな場面で便利なのか

indexOf() は学習用の例だけでなく、実際のプログラムでもかなり役立ちます。

たとえば、次のような場面があります。

場面使い方のイメージ
メールアドレスの確認@ が含まれているかを調べる
ファイル名の確認. がどこにあるかを探す
文章の検索特定の語句が含まれているかを調べる
区切り位置の発見ハイフンやスラッシュの位置を見つける

このように、indexOf() は単なる練習用メソッドではなく、文字列処理の基本としてさまざまな場面に応用できます。

文字だけでなく文字列も検索できる

今回の例では1文字を検索していますが、indexOf() は文字列そのものを検索することもできます。

たとえば、次のような使い方です。

String text = "東京タワー";
int num = text.indexOf("タワ");

この場合、タワ が始まる位置が返されます。

このように、indexOf() は char だけでなく String も引数に取れるので、1文字検索にも部分文字列検索にも使える便利なメソッドです。

整理すると、次のようになります。

書き方検索対象
indexOf(char)1文字を探す
indexOf(String)文字列を探す

よくある注意点

indexOf() を使うときには、いくつか気をつけたい点があります。

注意点内容
位置は 0 から始まる1文字目は 0
見つからないと -10 ではないので注意する
最初に見つかった位置を返す2回目以降ではない
入力は文字列として受け取られる1文字だけ取り出すなら charAt(0) が必要なことがある

特に、見つからなかったときの値が -1 という点はとても大切です。ここを 0 と勘違いすると、先頭にある文字と区別できなくなってしまいます。

今後の文字列処理につながる大事な一歩

indexOf() を理解すると、文字列の中をただ見るだけでなく、条件に応じて調べる処理ができるようになります。これは、この先に学ぶ substring() や startsWith()、endsWith() などのメソッドともつながる大切な考え方です。

たとえば、ある記号の位置を indexOf() で探して、その位置をもとに substring() で前半と後半を切り分ける、といった処理にも発展できます。つまり、位置を調べるという操作は、より複雑な文字列処理の土台になるのです。

Stringクラスの indexOf() メソッドは、指定した文字や文字列がどこにあるかを調べる、とても基本的で使い道の広いメソッドです。文字列の位置を返すという考え方と、見つからないときは -1 が返るというルールをしっかり押さえておくと、文字列を使ったプログラムがぐっと書きやすくなります。