JavaのStringで文字列の中に特定の文字列が含まれているか確認したいことがあります。
「特定の文字列の有無で処理を分岐させたい」
「何文字目にあるか確認したい」
この記事ではそんな疑問を解決する「indexOf」メソッドについてわかりやすく解説します!
なお、Javaの記事については、こちらにまとめています。
文字列の中に特定の文字列は含まれている?
文字列の中に特定の文字列があるか、また何文字目にあるか確認するためには、indexOfメソッドを使用します。
以下のサンプルでは特定の文字列の有無を取得しています。
public class string_indexof { public static void main(String[] args) { // 変数の宣言 String moji1 = "あるところにおじいさんがいました"; String moji2 = "あるところにおばあさんがいました"; // 特定の文字列「おじいさん」が存在するか出力 System.out.println("moji1の結果:" + moji1.indexOf("おじいさん")); System.out.println("moji2の結果:" + moji2.indexOf("おじいさん")); } }
実行結果
moji1の結果:6 moji2の結果:-1
indexOfメソッドを使用すると存在する場合「6」、存在しない場合「-1」が出力されました。
つまり
「特定の文字列が存在する場合、先頭を0として数えた番号(要素数)を返す」
「特定の文字列が存在しない場合、-1を返す」
となり、存在の有無で処理を分岐させることができます。
※Javaでは色々な順番を1からではなく0から数えます。配列も同じ考え方です。
※indexOfメソッドが返す結果は「int型(数値)」です。
また、indexOfメソッドは指定した文字数以降から確認することもできます。
以下のサンプルでは特定の文字列の有無を指定の文字数以降から取得しています。
public class string_indexof { public static void main(String[] args) { // 変数の宣言 String moji1 = "おじいさんとおばあさんがいました"; // 特定の文字列「さん」が // 要素数4(5文字目)から存在するか出力 System.out.println("moji1の結果:" + moji1.indexOf("さん",4)); } }
実行結果
moji1の結果:9
indexOfメソッドに2つ目の引数「4」を指定したため先頭ではなく5文字目から検索した結果、おじい「さん」ではなく、おばあ「さん」の要素数が出力されました。
さらにlastIndexOfメソッドを使用すれば末尾から確認することもできます。
以下のサンプルでは特定の文字列の有無を先頭ではなく末尾から取得しています。
public class string_indexof { public static void main(String[] args) { // 変数の宣言 String moji1 = "おじいさんとおばあさんがいました"; // 特定の文字列「さん」が存在するか出力 System.out.println("moji1の結果(先頭):" + moji1.indexOf("さん")); System.out.println("moji1の結果(末尾):" + moji1.lastIndexOf("さん")); } }
実行結果
moji1の結果(先頭):3 moji1の結果(末尾):9
indexOfメソッドは先頭から検索したため、おじい「さん」の要素数が出力され、lastIndexOfメソッドは末尾から検索したため、おばあ「さん」の要素数が出力されました。
2つを使用することで特定の文字列が複数あるかの確認ができます。便利ですね!
似たメソッド
indexOfメソッドに似た使い方でcontainsメソッドがあります。
どんな違いがあり、どう使い分ければよいのでしょうか?
以下のサンプルでは特定の文字列の存在有無をindexOfメソッドとcontainsメソッドで取得しています。
public class string_indexof { public static void main(String[] args) { // 変数の宣言 String moji1 = "あるところにおじいさんがいました"; // 特定の文字列「おじいさん」が存在するか出力 System.out.println("indexOfの結果:" + moji1.indexOf("おじいさん")); System.out.println("containsの結果:" + moji1.contains("おじいさん")); } }
実行結果
indexOfの結果:6 containsの結果:true
indexOfメソッドは要素数である6を出力し、containsメソッドはtrueを出力しました。
条件分岐(if)を学習した方はピンときたと思います。
contrainsメソッドが返す結果は「boolean型」です。
使い分けとしては単純に存在有無だけであればどちらでも良いですが、存在有無+文字列を抽出したい(substring)場合はindexOfメソッドを使えば、どこから抽出すればよいかも同時にわかるためオススメです。
※文字列の抽出(substring)については以下でわかりやすく説明しています。
indexOf/lastIndexOfで正規表現
indexOfメソッドやlastIndexOfメソッドを使用する上で注意点があります。
プログラムで検索といえば必ずと言っていいほど出てくる「正規表現」は使えません。
(上記サンプルコードで言うと「おじいさんとおばあさん」を検索したいから「お*さん」を使う、といったこと)
テストする際のバグの原因になりますので忘れないようにしたいですね。
※正規表現については以下でわかりやすく説明しています。
まとめ
indexOfメソッドを使った特定の文字列の存在有無を取得する方法について説明しました。
プログラミングする上で「これは想定通りの値なのか」という処理は必ず行います。
想定通りでない場合思わぬ不具合が発生するからです。
(最悪の場合設計からやり直し、ということもあります)
チェックがしっかりしているプログラムは、とても良いプログラムだと思います。
もしindexOfメソッドの使い方を忘れてしまったら、この記事を思い出して下さい!