web-dev-qa-db-fra.com

Jumelage gourmand, non-gourmand, tout-gourmand, dans, regex c #

Comment puis-je obtenir tous les résultats dans l'exemple suivant:

// Only "abcd" is matched
MatchCollection greedyMatches = Regex.Matches("abcd", @"ab.*");

// Only "ab" is matched
MatchCollection lazyMatches   = Regex.Matches("abcd", @"ab.*?");

// How can I get all matches: "ab", "abc", "abcd"

P.S .: Je veux avoir tous les matchs d'une manière générique. L'exemple ci-dessus est juste un exemple.

21
Peter Lee

Vous pourriez utiliser quelque chose comme:

MatchCollection nonGreedyMatches = Regex.Matches("abcd", @"(((ab)c)d)");

Ensuite, vous devriez avoir trois références arrière avec ab, abc et abcd.

Mais, pour être honnête, ce genre de regex n'a pas beaucoup de sens, surtout quand il grossit, il devient illisible.

Modifier:

MatchCollection nonGreedyMatches = Regex.Matches("abcd", @"ab.?");

Et vous avez une erreur là-bas. Cela ne peut correspondre qu'à ab et abc (lire: ab + tout caractère (optionnel)

Version paresseuse de:

MatchCollection greedyMatches    = Regex.Matches("abcd", @"ab.*");

est:

MatchCollection nonGreedyMatches    = Regex.Matches("abcd", @"ab.*?");
19
Tseng

Si une solution existe, elle implique probablement un groupe de capture et l'option RightToLeft:

string s = @"abcd";
Regex r = new Regex(@"(?<=^(ab.*)).*?", RegexOptions.RightToLeft);
foreach (Match m in r.Matches(s))
{
  Console.WriteLine(m.Groups[1].Value);
}

sortie:

abcd
abc
ab

Je dis "si" parce que, bien que cela fonctionne pour votre cas de test simple, je ne peux pas garantir que cette astuce vous aidera à résoudre votre problème réel. Le mode RightToLeft est l’une des fonctionnalités les plus innovantes de .NET. En un rien de temps, je ne peux penser à aucune autre saveur qui ait un équivalent. La documentation officielle à ce sujet est rare (c'est le moins que l'on puisse dire) et jusqu'à présent, il semble que peu de développeurs l'utilisent et partagent leurs expériences en ligne. Alors essayez et voyez ce qui se passe.

4
Alan Moore

Vous ne pouvez pas obtenir trois résultats différents d'un seul match.

Si vous souhaitez uniquement faire correspondre "ab", vous pouvez utiliser ab.? ou a.{1} (ou de nombreuses autres options).
Si vous souhaitez uniquement faire correspondre "abc", vous pouvez utiliser ab. ou a.{2} (ou de nombreuses autres options).
Si vous souhaitez uniquement faire correspondre "abcd", vous pouvez utiliser ab.* ou a.{3} (ou de nombreuses autres options).

1
Colin Hebert