50

一致結果のリストを正規表現から変換するにはどうすればよい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
4

6 に答える 6

118

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

MatchCollection matchList = Regex.Matches(Content, Pattern);
var list = matchList.Cast<Match>().Select(match => match.Value).ToList();
于 2012-10-04T15:21:41.480 に答える
15

正規表現の一致のリストだけを取得するには、次のようにします。

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));

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

于 2014-01-14T20:41:26.360 に答える
6

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();
    }
}
于 2012-10-04T15:15:33.613 に答える
1

これがあなたのコードにうまく適合する別の解決策です。

while (_matchList.Success)
{
    _returnValue.Add(_matchList.Value);
    _matchList = _matchList.NextMatch();
}
于 2012-10-04T15:27:46.180 に答える
0

歴史的に、Regexコレクションはジェネリックコレクションインターフェイスを実装しておらず、使用しているLINQ拡張メソッドはジェネリックインターフェイスで動作します。MatchCollectionはIListを実装するために.NETCoreで更新されたため、Selectextensionメソッドで使用できますが、.NET Standard 2.0に移行すると、そのインターフェイス実装が存在しないため、Selectを呼び出すことはできません。代わりに、LINQ CastまたはOfType拡張機能を使用してに変換する必要があります。そうすれば、その上でIEnumerable使用できますSelect。お役に立てば幸いです。

Regex wordMatcher = new Regex(@"\p{L}+");
return wordMatcher.Matches(text).Cast<Match>().Select(c => c.Value);

Regex wordMatcher = new Regex(@"\p{L}+");
return wordMatcher.Matches(text).OfType<Match>().Select(c => c.Value);
于 2020-05-16T07:29:49.147 に答える
-1
var regex = new Regex("{([A-Za-z])*}");
var result= regex.Matches(text).Where(p => p.Success).Select(p => p.Value).ToList();
于 2020-02-07T08:27:53.817 に答える