net ismatch example create c# regex greedy regex-greedy non-greedy

create - regex ismatch c# example



Coincidencia codiciosa, no codiciosa, codiciosa en C#Regex (3)

¿Cómo puedo obtener todas las coincidencias en el siguiente ejemplo:

// 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"

PD: quiero tener todas las coincidencias de manera genérica. El ejemplo de arriba es solo un ejemplo.


No puedes obtener tres resultados diferentes de una sola partida.

Si quieres hacer coincidir solo "ab" puedes usar ab.? o a.{1} (o muchas otras opciones)
Si quieres hacer coincidir solo "abc" puedes usar ab. o a.{2} (o muchas otras opciones)
Si solo quieres hacer coincidir "abcd" puedes usar ab.* O a.{3} (o muchas otras opciones)


Podrías usar algo como:

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

Entonces deberías tener tres referencias con ab, abc y abcd.

Pero, para ser honesto, este tipo de expresión regular no tiene mucho sentido, especialmente cuando crece, se vuelve ilegible.

Editar:

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

Y tienes un error por cierto. Esto solo puede coincidir con ab y abc (lea: ab + cualquier carácter (opcional)

Versión perezosa de:

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

es:

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


Si existe una solución, probablemente involucre un grupo de captura y la opción RightToLeft:

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

salida:

abcd abc ab

Digo "si" porque, si bien funciona para su caso de prueba simple, no puedo garantizar que este truco le ayude con su problema del mundo real. RightToLeft modo RightToLeft es una de las características más innovadoras de .NET. A primera vista, no puedo pensar en otro sabor que tenga algo equivalente. La documentación oficial es escasa (por decirlo suavemente), y hasta ahora no parece haber muchos desarrolladores que la usen y compartan sus experiencias en línea. Así que pruébalo y ve qué pasa.