web-dev-qa-db-fra.com

Convertir le résultat des correspondances de l'expression régulière en liste de chaînes

Comment puis-je convertir la liste des résultats de correspondance de l'expression régulière en List<string>? J'ai cette fonction mais elle génère toujours une exception,

Impossible de convertir un objet de type "System.Text.RegularExpressions.Match" en type "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;
}

Si j'ai cette chaîne,

I have a dog and a cat.

regex

dog|cat

Je veux que la fonction renvoie le résultat dans List<string>

dog
cat
38
SkyDrive

Avec le Regex que vous avez, vous devez utiliser Regex.Matches pour obtenir la liste finale des chaînes comme vous le souhaitez:

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

Réponse de publication croisée de Boucle via des correspondances d'expression régulière -

Pour obtenir juste une liste de matchs Regex, vous pouvez:

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

Cela "aplatira" toutes les valeurs capturées en une seule liste. Pour conserver les groupes de capture, utilisez Select plutôt que SelectMany pour obtenir une liste de listes.

12
drzaus

Une solution possible avec 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

Voici une autre solution qui s'intégrera bien dans votre code.

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