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
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();
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.
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();
}
}
Voici une autre solution qui s'intégrera bien dans votre code.
while (_matchList.Success)
{
_returnValue.Add(_matchList.Value);
_matchList = _matchList.NextMatch();
}