【VB.NET】文字列の位置を取得する(IndexOf/LastIndexOf)

VB.NET
この記事は約4分で読めます。

概要

String.IndexOfメソッドは、文字列の始めから検索し指定した文字列と一致する部分があるかを探し、見つかったら、最初に見つかった位置を0以上の整数で返します。見つからなければ、-1を返します。

String.LastIndexOfメソッドは、文字列の後ろから検索し指定した文字列と一致する部分があるかを探し、見つかったら、最初に見つかった位置を0以上の整数で返します。見つからなければ、-1を返します。

String.LastIndexOfメソッドの説明で最後に見つかったと説明を受けた人もいるかもしれません。間違いではないのですが、正確にいうと後ろから探していって最初に見つかった位置です。

詳しくはサンプルソースの下に記載してます。

サンプルソース

色々説明するより、サンプルソースを書いて実行したほうが早く覚えられます。

Module Module2
    Sub main()

        Dim st As String = "ABCDE ABCDE"

        Console.WriteLine(st.IndexOf("CD")) ' 出力:2
        Console.WriteLine(st.LastIndexOf("CD")) ' 出力:8

        Console.WriteLine(st.IndexOf("AB")) ' 出力:0
        Console.WriteLine(st.LastIndexOf("AB")) ' 出力:6

        Console.WriteLine(st.IndexOf("ab")) ' 出力:-1
        Console.WriteLine(st.LastIndexOf("ab")) ' 出力:-1

        Console.WriteLine(st.IndexOf(" ")) ' 出力:5
        Console.WriteLine(st.LastIndexOf(" ")) ' 出力:5

        Console.WriteLine(st.IndexOf("")) ' 出力:0
        Console.WriteLine(st.LastIndexOf("")) ' 出力:10

        ' 検索開始位置を指定
        Console.WriteLine(st.IndexOf("AB", 5)) ' 出力:6
        Console.WriteLine(st.LastIndexOf("AB", 5)) ' 出力:0

        Console.WriteLine(st.IndexOf("AB", 0)) ' 出力:0
        Console.WriteLine(st.LastIndexOf("AB", 0)) ' 出力:-1

    End Sub

End Module

検索位置を指定した場合の例を見て欲しいのですが、インデックの位置が6と0になっています。「IndexOf」の場合は、なんとなくわかるからいいとして、「LastIndexOf」の場合インデックスの位置が0になっています。

サンプルソース一部抜粋

 ' 検索位置を指定
Console.WriteLine(st.IndexOf("AB", 5)) ' 出力:6
Console.WriteLine(st.LastIndexOf("AB", 5)) ' 出力:0

これは

文字列”ABCDE ABCDE”に対して図のように検索している為です。

検索開始位置に「5」を指定すると、IndexOfで最初に見つかったのは、後ろの”AB”で、LastIndexOfで最初に見つかったのは最初の”AB”になると言う事です。

というわけで、もう一度言いますが、

String.LastIndexOfメソッドの説明で最後に見つかったと説明を受けた人もいるかもしれまえん。間違いではないのですが、正確にいうと後ろから見ていって最初に見つかった位置です。

インデックス番号を指定しない場合は、見ためとしては最後に見つかったでも一応間違いではないのですが、LastIndexOfを使った時の動きで困惑する場合があるので、内部的な動きも覚えておいてください。

大文字小文字区別しない方法

「StringComparison.OrdinalIgnoreCase」を指定し、大文字小文字を区別しない方法もあります。

「OrdinalIgnoreCase」はオリジナルを無視するっという意味

サンプルソース

Module Module2
    Sub main()

        Dim st As String = "ABCDE ABCDE"

        Console.WriteLine(st.IndexOf("ab", StringComparison.OrdinalIgnoreCase)) ' 出力:0
        Console.WriteLine(st.LastIndexOf("ab", StringComparison.OrdinalIgnoreCase)) ' 出力:6

    End Sub

End Module

 

コメント

タイトルとURLをコピーしました