nprogram’s blog

気ままに、プログラミングのトピックについて書いていきます

C#で、正規表現を使って、一行から複数の文字列を抽出する

C#で、正規表現を使って、一行から複数の文字列を抽出するには、

名前空間System.Text.RegularExpressionsのMatchクラスのMatch.Groupsプロパティを使用して抽出できます。

Match.Groupsプロパティは、正規表現に一致したグループのコレクションを取得するプロパティです(以下、ドキュメント)。

https://msdn.microsoft.com/ja-jp/library/system.text.regularexpressions.match.groups(v=vs.110).aspx

早速、テストコードで試していきたいと思います。 テスト文字列は、OKパターンとNGパターンの二つを用意しました。 テスト文字列のカタカナ文字列を取得するように、正規表現パターンを記載しました。

正規表現の記載の仕方は、以下のサイトがわかりやすいです。 qiita.com

using System;
using System.Text.RegularExpressions;

namespace RegexTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string logOK = "お客様のアカウントのセットアップを完了するには、このメールアドレスがご本人のものであることを確認する必要があります。";
            string logNG = "お客様のアカウントのセットアップを完了するには、このメールアドレスが偽物であることを確認する必要があります。";

            // 正規表現オブジェクトをインスタンス化する
            Regex regex = new Regex("お客様の(.*)の(.*)を完了するには、この(.*)がご本人のものであることを確認する");

            // 正規表現パターンをテキスト文字列と照合する
            Match match =  regex.Match(logOK);

            Console.WriteLine("OKログで、正規表現に一致したグループ個数 : " + match.Groups.Count + "\r\n照合結果 : " + match.Success);

            int i = 0;

            foreach (var item in match.Groups)
            {
                Console.WriteLine("match.Groups[" + i + "] : " + item);
                i++;
            }

            match = regex.Match(logNG);

            Console.WriteLine("\r\nNGログで、正規表現に一致したグループ個数 : " + match.Groups.Count + "\r\n照合結果 : " + match.Success);

            i = 0;

            foreach (var item in match.Groups)
            {
                Console.WriteLine("match.Groups[" + i + "] : " + item);
                i++;
            }

            Console.ReadLine();
        }
    }
}

[テストプログラム実行結果] f:id:nprogram:20171206074801p:plain

OKパターンの場合は、照合結果[Match.Successプロパティの値]がTrueとなりますが、

NGパターンでは、照合結果[Match.Successプロパティの値]がFalseとなります。

OKパターンのテスト結果を見てわかるように、コレクションの最初の要素は、照合した文字列自体が格納されます。

その後は、照合した順番で、文字列が格納されます。