Home > C# > C# 学び直し > 正規表現

msdnのMatch.NextMatch()メソッドの説明を翻訳した。

新規作成日 2017-11-08/
最終更新日

Match.NextMatch()メソッドは、Regex.Matchメソッドと一緒に用い、入力文字列内の正規表現パターンに一致する文字列を全て取り出すためのメソッドです。

msdnの情報:Match.NextMatch()メソッド

確認した時点では、msdnのRegex.Match メソッドの説明は、翻訳が読みにくいので、自分で翻訳し直しました。

全ての部分を翻訳し直したわけではなく、また、リンクも再現していないので、元のページと比較しながらご利用下さい。

最後の一致が終了した位置(最後に一致した文字の後の文字)から開始する次の一致のために、結果と一緒に新しいMatchオブジェクトを返します。

構文

public Match NextMatch()

戻り値

Type: System.Text.RegularExpressions.Match

次の正規表現が一致します。

例外

例外 状態
RegexMatchTimeoutException タイムアウトが発生しました。

備考

このメソッドは、もう一度Regex.Match(String, Int32)を呼び出し、そして、新しい開始位置として(Index+Length)を渡すことに類似しています。

メモ

このメソッドは、現在のインスタンスを変更しません。その代わりに、それは、次のMatchに関する情報が含まれる、新しいMatchオブジェクトを返します。

次の一致を取得しようとすると、一致する操作のタイムアウト値が有効な場合、RegexMatchTimeoutExceptionを投げるかもしれません。そして、次の一致を見つける試みは、タイムアウト間隔がより優れています。

呼び出し時の注意:

NextMatchメソッドを呼び出すことによって、一致の試みが、繰り返されるとき、正規表現エンジンは、一致がないとき、特別な処理を与えます。通常、NextMatchは、次の一致のための検索を先程の一致が中断した場所から正確に開始します。しかしながら、 一致が見つからなかった後で、次の一致を試みる前の1つの文字で、NextMatchメソッドに、進みます。 この動作は、正規表現エンジンが、文字列を進めるを保証します。それ以外の場合には、一致が見つからない場合、前の動作の結果を生じないため、次の一致は、前の一致と正確に同じ場所から開始します。 そして、それは、繰り返し同じ空の文字列と一致します。

次の例は、図を提供します。正規表現パターンa*は、文字列の「abaabb」で文字「a」の0以上の出現を検索します。 この例の出力が示すように、検索は、6箇所で一致を見つけます。最初の一致の試みは、最初の「a」を見つけます。 2つ目の一致は、正確に、はじめのbの前の最初の一致が終了したところから開始します。; それは「a」の0個の出現を見つけて、空の文字列を返します。2つ目の一致は、空の文字列を返したため、3つ目の一致は、必ずしも2つ目の一致が終わったところから開始されません。 その代わりに、それは、はじめの「b」の後、1つの文字の後から開始されます。3つ目の一致は「a」の2つの出現を見つけて、「aa」を返します。2つ目「b」の前の3つ目の一致が終わった所から、4つ目の一致の試みが開始されます。そして、空の文字列を返します。 5つ目の一致の試みは、再び、1つの文字進めるため、それは、3つ目の「b」の前から始まります。そして、空の文字列を返します。 6つ目の一致は、最後「b」の後から始まります。そして、再び、空の文字列を返します。

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string pattern = "a*";
      string input = "abaabb";

      Match m = Regex.Match(input, pattern);
      while (m.Success) {
         Console.WriteLine("'{0}' found at index {1}.", 
                           m.Value, m.Index);
         m = m.NextMatch();
      }
   }
}
// The example displays the following output:
//       'a' found at index 0.
//       '' found at index 1.
//       'aa' found at index 2.
//       '' found at index 4.
//       '' found at index 5.
//       '' found at index 6.

使用例

次の例は、最初の一致を越えて、正規表現の一致を捕まえるために、NextMatchメソッドを使用します。

using System;
using System.Text.RegularExpressions;

class Example 
{
   static void Main() 
   {
      string text = "One car red car blue car";
      string pat = @"(\w+)\s+(car)";

      // Instantiate the regular expression object.
      // 新しい正規表現オブジェクトをインスタンス化します。
      Regex r = new Regex(pat, RegexOptions.IgnoreCase);

      // Match the regular expression pattern against a text string.
      // テキスト文字列に正規表現パターンが一致します。
      Match m = r.Match(text);
      int matchCount = 0;
      while (m.Success) 
      {
         Console.WriteLine("Match"+ (++matchCount));
         for (int i = 1; i <= 2; i++) 
         {
            Group g = m.Groups[i];
            Console.WriteLine("Group"+i+"='" + g + "'");
            CaptureCollection cc = g.Captures;
            for (int j = 0; j < cc.Count; j++) 
            {
               Capture c = cc[j];
               System.Console.WriteLine("Capture"+j+"='" + c + "', Position="+c.Index);
            }
         }
         m = m.NextMatch();
      }
   }
}
// This example displays the following output:
//       Match1
//       Group1='One'
//       Capture0='One', Position=0
//       Group2='car'
//       Capture0='car', Position=4
//       Match2
//       Group1='red'
//       Capture0='red', Position=8
//       Group2='car'
//       Capture0='car', Position=12
//       Match3
//       Group1='blue'
//       Capture0='blue', Position=16
//       Group2='car'
//       Capture0='car', Position=21
このエントリーをはてなブックマークに追加

Home PC C# Illustration

Copyright (C) 2011 Horio Kazuhiko(kukekko) All Rights Reserved.
kukekko@gmail.com
ご連絡の際は、お問い合わせページのURLの明記をお願いします。
「掲載内容は私自身の見解であり、所属する組織を代表するものではありません。」