Cómo Regex buscar / reemplazar solo la primera aparición en una cadena en .NET?

Parece que el método .NET Regex.Replace reemplaza automáticamente todas las coincidencias. Podría proporcionar un delegado de MatchEvaluator que devuelva la cadena coincidente después del primer reemplazo, sin mostrar ningún cambio, pero eso me parece muy ineficiente.

¿Cuál es la forma más eficiente de parar después del primer reemplazo?

Desde MSDN :

Replace(String, String, Int32) 

Dentro de una cadena de entrada especificada, reemplaza un número máximo especificado de cadenas que coinciden con un patrón de expresión regular con una cadena de reemplazo especificada.

¿No es esto lo que quieres?

Solo para responder la pregunta original … La siguiente expresión regular solo coincide con la primera instancia de la palabra foo:

(?< !foo.*)foo

Esta expresión regular usa el aspecto negativo detrás (? < !) Para asegurar que no se encuentre ninguna instancia de foo antes de la coincidencia.

Probablemente estabas usando el método estático. No hay sobrecarga (String, String, Int32) para eso. Construya un objeto regex primero y use myRegex.Replace.

En ese caso, no puedes usar:

 string str ="abc546_$defg"; str = Regex.Replace(str,"[^A-Za-z0-9]", ""); 

En su lugar, debe declarar una nueva instancia de Regex y usarla así:

 string str ="abc546_$defg"; Regex regx = new Regex("[^A-Za-z0-9]"); str = regx.Replace(str,"",1) 

Observe el 1 , representa la cantidad de veces que debe ocurrir el reemplazo.

En lugar de crear una new Regex , también puedes hacer

Regex.Replace(originalString, "^"+pattern, stringToReplaceWith);

para reemplazar la primera aparición.