IndexOfによる文字列検索で、指定した文字数以降の文字列を検索する - C#

string オブジェクトの IndexOf メソッドで指定した文字列以降を検索するコードを紹介します。

概要

文字列を検索する - IndexOfを利用した文字列の検索」では、IndexOfメソッドを用いて文字列を検索するコードを紹介しましたが、検索処理は常に文字列の先頭から開始されるため、文字列内に複数の検索にヒットする場所があった場合でも最初の該当位置しか返されません。この記事では指定した文字列以降を検索対象にすることで、複数の該当場所を取得できるようにします。

書式

IndexOfで指定した文字列以降の文字を検索対象にする場合は、IndexOfの第二引数に検索を開始する位置のインデックス番号(文字位置)を与えます。

プログラム例

UI

下図のUIを作成します。こちらの記事で作成したフォームにボタンを一つ追加したものです。

コード

下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SearchString
{
  public partial class FormSearchNext : Form
  {
    int pos = -1;

    public FormSearchNext()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      string text = textBox_Text.Text;
      string search = textBox_Search.Text;

      pos = text.IndexOf(search);
      textBox_Output.Text += string.Format("{0:d} 文字目で該当しました。\r\n",pos);
    }

    private void button2_Click(object sender, EventArgs e)
    {
      string text = textBox_Text.Text;
      string search = textBox_Search.Text;

      pos = text.IndexOf(search,pos+1);
      textBox_Output.Text += string.Format("{0:d} 文字目で該当しました。\r\n", pos);
    }
  }
}

解説

検索結果を保存するため、クラスのメンバ変数としてposを定義します。
  int pos = -1;

Button1は検索対象文字列の先頭から検索するロジックです。詳しくはこちらの記事を参照してください。
private void button1_Click(object sender, EventArgs e)
{
  string text = textBox_Text.Text;
  string search = textBox_Search.Text;

  pos = text.IndexOf(search);
  textBox_Output.Text += string.Format("{0:d} 文字目で該当しました。\r\n",pos);
}

button2は前回の検索結果以降の文字列を検索するロジックです。IndexOfの第二引数に前回の検索結果であるpos変数に1を加えることで、前回マッチした文字以降の文字列に対して検索を実行できます。
private void button2_Click(object sender, EventArgs e)
{
  string text = textBox_Text.Text;
  string search = textBox_Search.Text;

  pos = text.IndexOf(search,pos+1);
  textBox_Output.Text += string.Format("{0:d} 文字目で該当しました。\r\n", pos);
}

実行結果

プロジェクトを実行します。下図のフォームが表示されます。


テキストボックスに入力します。今回は以下の文字列を入力しました。
検索対象文字列 "シロクマとシクロマがシロクマシロクマった" 検索文字列 "シロクマ"

入力後[Search]ボタン(button1)をクリックします。文字列の先頭から検索した際の結果が表示されます。今回の例では先頭の文字が"シロクマ"で一致しているため、"0"が返ります。


続いて[Search Inc]ボタン(button2)をクリックします。前回の検索結果以降の文字列を検索します。6文字目に一致する文字列があるため、"5"が返ります。


[Search Inc]ボタンをクリックすると、前回の検索結果以降の文字列を順次検索します。


文字列の末尾まで検索し、該当する文字列が見つからない場合は"-1"を返します。


著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2015-01-21
iPentec all rights reserverd.