【C#入門】IndexOfで文字列やList、配列を検索する方法

IndexOfって使っていますか?C#では文字列や配列、Listから指定した対象を検索し、その位置を取得することができます。この記事では、IndexOfについて

  • IndexOfメソッドとは
  • 文字列内の文字を検索
  • Listの要素を検索
  • 配列の要素を検索
  • 文字列内の複数の該当箇所を検索
  • 後ろからの検索
  • 正規表現を使った検索

など応用的な内容についても解説していきます。今回はIndexOfについて、使い方をわかりやすく解説します!

目次

IndexOfメソッドとは

IndexOfメソッドは文字列内に含まれる文字、文字列の位置を取得することができます。また、Listや配列に含まれる要素のインデックス番号を取得することもできます。

StringクラスやListクラス、ArrayクラスなどそれぞれのクラスでIndexOfメソッドが用意されています。それぞれのクラスのIndexOfメソッドの使い方について解説していきます!

文字列内の文字を検索

まずは文字列内の文字もしくは文字列を検索する方法についてみていきましょう。IndexOfメソッドは以下のように定義されています。

public int IndexOf(
    string value
)

引数valueは検索する文字もしくは文字列を指定します。指定した文字、文字列が見つかった場合は、0から始まるインデックス番号を返します。見つからなかった場合は-1を返します。

サンプルコードで確認しましょう。

using System;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      string str = "Hello World!";
      string target = "l";
      
      int num = str.IndexOf(target) + 1;
      
      if(num > 0) {
        Console.WriteLine("{0}は{1}番目にあります", target, num);  
      } else {
        Console.WriteLine("{0}は見つかりませんでした", target);
      }
      
      Console.ReadKey();
    }
  }
}

実行結果:

lは3番目にあります

このサンプルコードでは、IndexOfメソッドを使って”l”を検索し、その位置を取得しています。

Listの要素を検索

Listの要素を検索する方法についてもみていきましょう。IndexOfメソッドは以下のように定義されています。

public int IndexOf(
    T item
)

引数itemは検索する要素を指定します。指定した要素が見つかった場合は、0から始まるインデックス番号を返します。見つからなかった場合は-1を返します。サンプルコードで確認しましょう。

using System;
using System.Collections.Generic;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      string[] src = {"Tokyo", "Osaka", "Nagoya"};
      var list = new List<string>();
      list.AddRange(src);
      string item = "Osaka";
      
      int num = list.IndexOf(item) + 1;
      
      if(num > 0) {
        Console.WriteLine("{0}は{1}番目にあります", item, num);  
      } else {
        Console.WriteLine("{0}は見つかりませんでした", item);
      }
      
      Console.ReadKey();
    }
  }
}

実行結果:

Osakaは2番目にあります

配列の要素を検索

配列の要素を検索する方法についてもみていきましょう。IndexOfメソッドは以下のように定義されています。

public static int IndexOf(
    Array array,
    object value
)

引数arrayは検索対象となる1次元配列を指定します。引数valueは検索する要素を指定します。指定した要素が見つかった場合は、0から始まるインデックス番号を返します。

見つからなかった場合は-1を返します。サンプルコードで確認しましょう。

using System;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      string[] src = {"Tokyo", "Osaka", "Nagoya"};
      string item = "Osaka";
      
      int num = Array.IndexOf(src, item) + 1;
      
      if(num > 0) {
        Console.WriteLine("{0}は{1}番目にあります", item, num);  
      } else {
        Console.WriteLine("{0}は見つかりませんでした", item);
      }
      
      Console.ReadKey();
    }
  }
}

実行結果:

Osakaは2番目にあります

文字列内の複数の該当箇所を検索

IndexOfメソッドでは検索して見つかった最初の位置を返します。それでは同じ文字、文字列、要素が複数含まれていて、その全ての位置を取得したい場合はどのようにすればいいでしょうか?

IndexOfメソッドは引数の指定で検索を開始する位置を指定することができます。

public int IndexOf(
    string value,
    int startIndex
)

引数valueには検索する文字列を指定します。引数startIndexには検索が開始される位置を指定します。これを使って全ての位置を取得する方法をご紹介します。

using System;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      string str = "Hello World!";
      string target = "l";
      
      int num = str.IndexOf(target);
      
      if(num > 0) {
        Console.WriteLine("{0}は{1}番目にあります", target, num + 1);
        
        // IndexOfメソッドで見つからなくなるまで繰り返す
        while(num > 0) {
          //見つかった位置の次の位置から検索
          num = str.IndexOf(target, num + 1);
          if(num > 0) {
            Console.WriteLine("{0}は{1}番目にあります", target, num + 1);
          }
        }
      } else {
        Console.WriteLine("{0}は見つかりませんでした", target);
      }
      
      Console.ReadKey();
    }
  }
}

実行結果:

lは3番目にあります
lは4番目にあります
lは10番目にあります

このサンプルコードでは、IndexOfメソッドを使って”Hello World!”から”l”の位置を全て取得しています。IndexOfメソッドの第2引数を見つかった位置の次の位置から検索されるように指定し、while文を使って見つからなくなるまで繰り返しています。

後ろからの検索

IndexOfメソッドでは検索して見つかった最初の位置を返します。それでは後ろから検索したい場合はどうすればいいのでしょうか?

そのような場合にはLastIndexOfメソッドを使用します。LastIndexOfメソッドは以下のように定義されています。

public int LastIndexOf(
    string value
)

引数valueには検索する文字、文字列を指定します。後ろから検索して最初に見つかったインデックス番号を返します。サンプルコードで確認しましょう。

using System;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      string str = "Hello World!";
      string target = "l";
      
      int num = str.LastIndexOf(target) + 1;
      
      if(num > 0) {
        Console.WriteLine("{0}は{1}番目にあります", target, num);  
      } else {
        Console.WriteLine("{0}は見つかりませんでした", target);
      }
      
      Console.ReadKey();
    }
  }
}

実行結果:

lは10番目にあります

正規表現を使った検索

文字列に正規表現にマッチする文字列が含まれているか検索したい場合があります。正規表現とはいくつかの文字列を一つの形式でまとめて表現するための表現方法のことです。主な正規表現については下記のとおりになります。

記号記号の説明例の説明
.任意の1文字。改行文字は除く。.+任意の文字列
*直前の1文字の0回以上の繰り返しと一致hoge*hogeもしくはhogee...と一致
^行の先頭^[0-9]行頭が数字
$行の末尾^.{10}$10文字の行
[ ]カッコ内の任意の1文字と一致。「-」で範囲指定可。[a-z]小文字のアルファベット1文字と一致
[^ ]カッコ内の任意の1文字と不一致。「-」で範囲指定可。[^A-Z]大文字のアルファベット以外
+直前の文字の1個以上の繰り返しと一致hoge+hogee...と一致
?直前の文字の0または1文字と一致hoge?eと一致
{ }カッコ内の数値の繰り返しと一致{n}直前の文字のn個の繰り返しと一致
{,n}直前の文字のn個以下の繰り返しと一致
{m,}直前の文字のm個以上の繰り返しと一致
{m,n}直前の文字のm個以上、n個以下の繰り返しと一致
|直前、直後どちらかのパターンに一致hoge|piyohogeまたはpiyo
( )カッコ内をグループ化。マッチした内容は参照可。

C#で正規表現にマッチする文字列が含まれているか検索するには、System.Text.RegularExpressions.Regexクラスを使います。

用意されているメソッドには、指定した正規表現が含まれているか確認するためのIsMatchメソッドや検索するためのMatchesメソッドなどがあります。Regexクラスの簡単な使い方について、サンプルコードでご紹介します。

using System;
using System.Text.RegularExpressions;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      string str = "侍エンジニア";
      string target = "[エンジニア]";
      
      if(Regex.IsMatch(str, target)) {
        MatchCollection mc = Regex.Matches(str, target);
        foreach(Match m in mc) {
          Console.WriteLine("{0}は{1}番目にあります", m.Value, m.Index + 1);
        }
      } else {
        Console.WriteLine("{0}は見つかりませんでした", target);
      }
      
      Console.ReadKey();
    }
  }
}

実行結果:

エは2番目にあります
ンは3番目にあります
ジは4番目にあります
ニは5番目にあります
アは6番目にあります

このサンプルコードでは、RegularExpressionsクラスを使って正規表現で検索しています。正規表現パターンには”エ”、”ン”、”ジ”、”ニ”、”ア”のいずれかの文字を指定しています。

IsMachメソッドで指定した正規表現パターンが含まれるか確認を行い、Machesメソッドを使って文字列str内の全ての文字に対してマッチングを行っています。

Machesメソッドの戻り値はMatchCollectionクラスのオブジェクトmcに格納され、foreachステートメントを使ってオブジェクト1つずつにアクセスしています。

MatchクラスのプロパティValueおよびIndexを使って、マッチングした文字列と位置をそれぞれ取得しています。

まとめ

ここでは、IndexOfメソッドについて説明しました。IndexOfメソッドは文字列内に含まれる文字、文字列の位置を取得することができます。また、Listや配列に含まれる要素のインデックス番号を取得することもできます。

使いこなすことができるように、この記事を何度も参考にして下さいね!

この記事を書いた人

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
info@sss-lab.com

目次