文字列の中から特定の文字列で囲まれたデータを取得

2019年6月29日

長い文字列から特定のパターンを抽出して利用した場合があります。正規表現を使うことで実現できますのでサンプルを確認してみましょう。

サンプル

例えば、「あなたの身長は180cmです」という文から180cmを抜き出したい場合、

GetExtractedData("私の身長は180cmです", "身長は", "です");

という呼び出し方で取得することができます。結果は

180cm

と表示されます。

戻り値はList<string>型なので、実際の呼び出しは次のようになります。

var history = GetExtractedData("私の身長は180cmです", "身長は", "です");

foreach (var info in history)
{
    Console.WriteLine(info);
}

文字列中でいくつか同じ条件がある場合、戻り値は複数得られます。(List型)

var history = GetExtractedDataFromUrl("私の身長は180cmです。あなたの身長は190cmです", "身長は", "です");

foreach (var info in history)
{
    Console.WriteLine(info);
}

結果は

180cm
190cm

となります。

コード

/// <summary>
/// 文字列の中から特定の文字列で囲まれたデータを取得
/// 複数箇所の取得もできる
/// frontPat + ほしい文字列 + endPat
/// </summary>
/// <param name="dataList">元のデータ</param>
/// <param name="frontPat">抽出したいデータの前の文字列</param>
/// <param name="endPat">抽出したいデータの後ろの文字列</param>
/// <returns>抽出した文字列リスト</returns>
private static List<string> GetExtractedData(string dataList, string frontPat, string endPat)
{
    // データの抽出のためのマッチパターン(正規表現)
    // (ExtractedData:抽出したデータの意味)
    var anchor = $"({frontPat})(?<ExtractedData>.*?)({endPat})";

    // 正規表現でマッチする条件のオプションセット
    var options =
                // 大文字小文字の違いを無視
                RegexOptions.IgnoreCase |

                // 単一行モード(改行を含む文字列でも、それを改行とみなさず他の文字と同等に処理)
                RegexOptions.Singleline;

    // 抽出したデータをセットする変数(List)
    var extractedData = new List<string>();

    // 正規表現でマッチしたデータのみ抽出
    foreach (Match match in Regex.Matches(dataList, anchor, options))
    {
        // マッチしたデータのみ抽出データにAddする。
        // .ValueでMatchクラスのデータ部分のみ取得できる
        extractedData.Add(match.Groups["ExtractedData"].Value);
    }

    // 条件にマッチしたデータセット
    return extractedData;
}
public class MyClass
{

    static void Main()
    {
        var history = GetExtractedData("あなたの身長は180cmです。あなたの身長は190cmです", "身長は", "です");

        foreach (var info in history)
        {
            Console.WriteLine(info);
        }
    }
}

参考リンク

C#

Posted by hidepon