web-dev-qa-db-ja.com

一致の結果を正規表現から文字列のリストに変換します

一致結果のリストを正規表現からList<string>に変換するにはどうすればよいですか?この機能はありますが、常に例外が生成されます。

タイプ 'System.Text.RegularExpressions.Match'のオブジェクトをタイプ 'System.Text.RegularExpressions.CaptureCollection'にキャストできません。

public static List<string> ExtractMatch(string content, string pattern)
{
    List<string> _returnValue = new List<string>();
    Match _matchList = Regex.Match(content, pattern);
    while (_matchList.Success)
    {
        foreach (Group _group in _matchList.Groups)
        {
            foreach (CaptureCollection _captures in _group.Captures) // error
            {
                foreach (Capture _cap in _captures)
                {
                    _returnValue.Add(_cap.ToString());
                }
            }
        }
    }
    return _returnValue;
}

この文字列がある場合、

I have a dog and a cat.

正規表現

dog|cat

関数がList<string>に結果を返すようにしたい

dog
cat
38
SkyDrive

正規表現では、Regex.Matchesを使用して、必要な文字列の最終リストを取得する必要があります。

MatchCollection matchList = Regex.Matches(Content, Pattern);
var list = matchList.Cast<Match>().Select(match => match.Value).ToList();
97
manojlds

正規表現一致によるループ -からのクロスポスト回答

正規表現の一致リストのみを取得するには、次の方法があります。

var lookfor = @"something (with) multiple (pattern) (groups)";
var found = Regex.Matches(source, lookfor, regexoptions);
var captured = found
                // linq-ify into list
                .Cast<Match>()
                // flatten to single list
                .SelectMany(o =>
                    // linq-ify
                    o.Groups.Cast<Capture>()
                        // don't need the pattern
                        .Skip(1)
                        // select what you wanted
                        .Select(c => c.Value));

これにより、キャプチャされたすべての値が単一のリストに「フラット化」されます。キャプチャグループを維持するには、SelectではなくSelectManyを使用してリストのリストを取得します。

12
drzaus

Linqを使用した可能なソリューション:

using System.Linq;
using System.Text.RegularExpressions;

static class Program {
    static void Main(string[] aargs) {
        string value = "I have a dog and a cat.";
        Regex regex = new Regex("dog|cat");
        var matchesList = (from Match m in regex.Matches(value) select m.Value).ToList();
    }
}
5
Paolo Tedesco

コードにうまく適合する別のソリューションを次に示します。

while (_matchList.Success)
{
    _returnValue.Add(_matchList.Value);
    _matchList = _matchList.NextMatch();
}
1
Kendall Frey