¿Cómo especificar que solo coincida la primera aparición?

¿Cómo puedo especificar que solo coincida con la primera aparición de una expresión regular en C # usando el método Regex?

Aquí hay un ejemplo:

string text = @""; string pattern = @"()"; Regex myRegex = new Regex(pattern, RegexOptions.IgnoreCase); Match m = myRegex.Match(text); // m is the first match while (m.Success) { // Do something with m Console.Write(m.Value + "\n"); m = m.NextMatch(); // more matches } Console.Read(); 

Me gustaría que esto solo reemplace hasta el primer . Y luego haz lo mismo para el rest de estos partidos.

Creo que solo necesitas agregar un calificador perezoso en el primer ejemplo. Cuando un comodín está “comiendo demasiado”, o bien necesitas un calificador perezoso en el comodín o, en un escenario más complicado, mira hacia adelante. Agregue un calificador perezoso en la parte superior ( .+? En lugar de .+ ), Y debería ser bueno.

Regex.Match (myString) devuelve la primera coincidencia que encuentra.

Las llamadas subsiguientes a NextMatch() en el objeto resultante de Match() continuarán coincidiendo con las siguientes apariciones, si las hubiera.

Por ejemplo:

  string text = "my string to match"; string pattern = @"(\w+)\s+"; Regex myRegex = new Regex(pattern, RegexOptions.IgnoreCase); Match m = myRegex.Match(text); // m is the first match while (m.Success) { // Do something with m m = m.NextMatch(); // more matches } 

EDITAR: Si está analizando HTML, consideraría seriamente usar el paquete de agilidad de HTML . Te ahorrarás muchos, muchos dolores de cabeza.

 string text = @""; string pattern = @"()"; //Regex myRegex = new Regex(pattern, RegexOptions.IgnoreCase); //Match m = myRegex.Match(text); // m is the first match Match m = Regex.Match(text, pattern, RegexOptions.IgnoreCase); /*while (m.Success) { // Do something with m Console.Write(m.Value + "\n"); m = m.NextMatch(); // more matches }*/ // use if statement; you only need 1st match if (m.Success) { // Do something with m.Value // m.Index indicates its starting location in text // m.Length is the length of m.Value // using m.Index and m.Length allows for easy string replacement and manipulation of text } Console.Read(); 

Tal vez un poco más simplificado, pero si recupera una colección de coincidencias y desea obtener el primer Match.Index puede buscar en la propiedad Match.Index para encontrar el índice más bajo.

Aquí está la documentación de MSDN al respecto.

Si es solo un problema de scope, entonces estoy de acuerdo con el comentario de Rich : es necesario utilizar modificadores no codiciosos para evitar que su expresión “coma” demasiado.

Utilice la agrupación combinada con RegExOptions.ExplicitCapture .

prueba esto

 string text = @" "; string pattern = @"()"; Regex myRegex = new Regex(pattern, RegexOptions.IgnoreCase); MatchCollection matches = myRegex.Matches(text); foreach (Match m in matches) { Console.Write(m.Value + "\n"); } Console.Read();