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

Matchメソッド,NextMatch()メソッド:指定したパターンに一致する部分文字列を見つける、取り出す

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

Matchメソッド,NextMatch()メソッド:指定したパターンに一致する部分文字列を見つける、取り出す

指定したパターンに一致する部分文字列を見つける、あるいは、取り出すには、Regex クラスのMatchメソッドとMatchクラスのNextMatch ()メソッドの組み合わせ、あるいは、Regex クラスのMatchesメソッドを使用します。

また、一致した部分文字列は、Match クラスに格納します。

msdnのMatchクラスの説明を翻訳した

MatchメソッドとNextMatch ()メソッドの組み合わせは、1つずつ結果を取得する際に使用し、Matchesメソッドは、一度に結果を取得する際に、使用します。対象とする文字列が大きければ、あるいは、結果を1つ1つ処理する際は、MatchメソッドとNextMatch ()メソッドの組み合わせを使用し、1つずつ結果を処理し、文字列が小さければ、あるいは、その後の処理に一致した結果全てを使用する場合は、Matchesメソッドを使って、まとめて結果を取得したのち、その結果を後で処理すると理解しておけば良いかと思います。ほとんどの場合、どちらを使用しても違いはありません。

MatchメソッドとNextMatch ()メソッドの組み合わせを使用する

Regex クラスのMatchesメソッドは、指定したパターンに一致する最初の部分文字列しか見つける事ができません。それ以降の指定したパターンに一致する部分文字列は、MatchクラスのNextMatch ()メソッドを使用します。

結果は、実行するたびに1つだけ取得されます。そのため、一致した結果を1つ1つ処理する場合、プログラムは、直感的な動作になり、一致結果を保存しておく必要もありません。

プログラムは、特徴的な構造をしているので、考えるのではなく雛形を覚えて使いまわす形で使用すると良いかと思います。

結果は、Matchクラスに格納します。

関連する資料では、Matchオブジェクトという表現も登場します。MatchクラスとMatchオブジェクトの用語の使い分けはよくわかりませんが、Matchクラス内のデータをMatchオブジェクトと表現すると理解しておけば、大きく間違っていることはないと思います。

返されたMatchオブジェクトのSuccessプロパティの値を確認することで、正規表現パターンが入力文字列で見つかったかどうかを判断することができます。

一致が見つかると、返されたMatchオブジェクトのValueプロパティには、正規表現パターンに一致する入力から、部分文字列が含まれています。一致するものが見つからない場合、その値はString.Emptyです。

返されたMatchオブジェクトのMatch.NextMatchメソッドを繰り返し呼び出すことによって、次の一致を検索することができます。

正規表現を使って検索を行うと、検索する文字列そのものではなく、正規表現パターンで指定した特定のパターンを持つ文字列全てを検索することができます。

msdnのRegex.Matchメソッドの説明を翻訳した

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

Regex.Match メソッド (String)

Regex.Match メソッド (String)は、インスタンスを作成する必要があります。同じ正規表現パターンをループの中で繰り返し使う場合は、あらかじめインスタンスを作成する必要のあるこちらのメソッドを使用すると処理速度の向上が期待できます。

using System;
using System.Text.RegularExpressions;

namespace RegularExperssion03
{
    class Program
    {
        static void Main(string[] args)
        {
            string text = "正規表現を使って検索を行うと、検索する文字列そのものではなく、正規表現パターンで指定した特定のパターンを持つ文字列全てを検索することができます。";
            string pat = @"検索";

            // 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);
            while (m.Success)
            {
                Console.WriteLine("「{0}」が見つかった場所は {1}", m.Value, m.Index);
                m = m.NextMatch();
            }
            // Keep the console window open in debug mode.
            // デバッグモードで、コンソール・ウインドウを開いた状態に維持します。
            System.Console.WriteLine("Press any key to exit.");
            System.Console.ReadKey();
        }
    }
}

Regex.Match メソッド (String, String)

Regex.Match メソッド (String, String)は、インスタンスを作成する必要がありません。

using System;
using System.Text.RegularExpressions;

namespace RegularExperssion03
{
    class Program
    {
        static void Main(string[] args)
        {
            string text = "正規表現を使って検索を行うと、検索する文字列そのものではなく、正規表現パターンで指定した特定のパターンを持つ文字列全てを検索することができます。";
            string pattern = @"検索";

            // Match the regular expression pattern against a text string.
            // テキスト文字列に正規表現パターンが一致します。
            Match m = Regex.Match(text, pattern);
            while (m.Success)
            {
                Console.WriteLine("「{0}」が見つかった場所は {1}", m.Value, m.Index);
                m = m.NextMatch();
            }
            // Keep the console window open in debug mode.
            // デバッグモードで、コンソール・ウインドウを開いた状態に維持します。
            System.Console.WriteLine("Press any key to exit.");
            System.Console.ReadKey();
        }
    }
}

Matchesメソッドの組み合わせを使用する

Matchesメソッドを使用すると、Matchクラスで、正規表現パターンの最初の一致を取得し後、NextMatch ()メソッドを繰り返すことなく、全ての一致を取得することができます。

取得した一致を1つ1つ処理するのではなく、まとめて処理する場合に便利です。

msdnのRegex.Matchesメソッドの説明を翻訳した

msdnのMatchCollectionクラスの説明を翻訳した

Regex.Matches メソッド (String)

using System;
using System.Text.RegularExpressions;

namespace RegularExperssion04
{
    class Program
    {
        static void Main(string[] args)
        {
            string text = "正規表現を使って検索を行うと、検索する文字列そのものではなく、正規表現パターンで指定した特定のパターンを持つ文字列全てを検索することができます。";
            string pattern = @"検索";

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

            foreach (Match match in rgx.Matches(text))
            {
                Console.WriteLine("「{0}」が見つかった場所は {1}", match.Value, match.Index);
            }
            // Keep the console window open in debug mode.
            // デバッグモードで、コンソール・ウインドウを開いた状態に維持します。
            System.Console.WriteLine("Press any key to exit.");
            System.Console.ReadKey();
        }
    }
}

Regex.Matches メソッド (String, String)

using System;
using System.Text.RegularExpressions;

namespace RegularExperssion04
{
    class Program
    {
        static void Main(string[] args)
        {
            string text = "正規表現を使って検索を行うと、検索する文字列そのものではなく、正規表現パターンで指定した特定のパターンを持つ文字列全てを検索することができます。";
            string pattern = @"検索";

            foreach (Match match in Regex.Matches(text, pattern))
            {
                Console.WriteLine("「{0}」が見つかった場所は {1}", match.Value, match.Index);
            }
            // Keep the console window open in debug mode.
            // デバッグモードで、コンソール・ウインドウを開いた状態に維持します。
            System.Console.WriteLine("Press any key to exit.");
            System.Console.ReadKey();
        }
    }
}
このエントリーをはてなブックマークに追加

Home PC C# Illustration

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