C#のStringで文字列検索

C#のStringでの文字列検索は、二つある。 (C#2.0以降)

一つは、以前から使われほかのプログラム言語でもお目にかかる、IndexOfでヒットした文字列の先頭位置を返すもの。
Hellowでellを探すと、1が帰る。なかったら-1が帰る。

もう一つは、C#2.0で追加された、Contains 。
こちらは、文字列があるか無いかでtrueかfalseを返す。

Containsの内部的にはIndexOfと同じことをしているので、下記のように同じ動作が可能。

String str = "Hellow";
String word = "ell";
if (str.IndexOf(word) > -1)
{
    MessageBox.Show("Hit");
}

if (str.Contains(word))
{
      MessageBox.Show("Hit");
}

検索した文字列から、Substring等で文字列を加工する場合には、IndexOfが必要だが、単純な条件分岐としては、Containsを使用したほうが、間違いも少なくコード的にも読みやすい気がする。Contains = 含む だしね。

なお、どちらも検索文字列に””と空文字を指定すると、先頭に空文字を発見したとしてIndexOfなら0、Containsならtrueを返す。
検索文字列に””が入ると、予期せぬ行動を起こすバグの元になりかねない。
(CSVファイル等の特定文字で分割したものを切ったものから検索とか・・)
なので、検索文字が空文字かどうか等を判断する処理String.IsNullOrEmptyかString.IsNullOrWhiteSpace等を入れたほうがよいかもしれない。

if (string.IsNullOrWhiteSpace(word) ? false : str.Contains(word))
{
      MessageBox.Show("Hit");
}

他にも、Containsと似た感じで、StartsWithとEndsWithというのがあり、指定した文字列で始まるか、指定した文字列で終わるかが、boolで帰るので、状況によっては便利かも。
たとえば、ファイル一覧から拡張子でヒットするものを探すとか?

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>