Por favor, haga publicaciones claras que la gente pueda entender. También edité este para ti. Debería haber especificado un idioma al menos aquí.
GEOCHET
Por supuesto, nunca se reemplaza ... siempre es una nueva cadena que contiene la original con el texto reemplazado. Esto se debe a que las cuerdas son inmutables.
Pablo Marambio
Probé el método `String.Replace ()`. pero reemplaza todo el "AA" con "XQ"
string str ="The brown brown fox jumps over the lazy dog";
str =ReplaceFirst(str,"brown","quick");
EDITAR : Como mencionó @itsmatt , también está Regex.Replace (String, String, Int32), que puede hacer lo mismo, pero probablemente sea más costoso en tiempo de ejecución, ya que utiliza un analizador con todas las funciones donde mi método hace una búsqueda y tres cadenas concatenaciones.
EDIT2 : si esta es una tarea común, es posible que desee convertir el método en un método de extensión:
publicstaticclassStringExtension{publicstaticstringReplaceFirst(thisstring text,string search,string replace){// ...same as above...}}
Usando el ejemplo anterior, ahora es posible escribir:
Interesante, ¿probó su suposición de que el enfoque de expresiones regulares es más caro en tiempo de ejecución? ¿Qué tal la velocidad? ¿Quizás la búsqueda usando Regex es más rápida que usando IndexOf?
mfloryan
Prefiero un poco la respuesta de @BilltheLizard que involucra Remove () e Insert () sobre este enfoque que involucra Substring (). ¿Existe alguna base para decir que uno es mejor que el otro?
JohnC
3
Atención: esto no funciona correctamente con Unicode que combina caracteres o ligaduras. Por ejemplo, ReplaceFirst("oef", "œ", "i")devuelve incorrectamente "ief" en lugar de "if". Consulte esta pregunta para obtener más información.
Michael Liu
2
ReSharper advierte String.IndexOf is culture specific.. Más robusto para actualizar int pos = text.IndexOf(search, StringComparison.Ordinal);.
Contango
64
Como dijo itsmatt , Regex.Replace es una buena opción para esto, sin embargo, para que su respuesta sea más completa, la completaré con una muestra de código:
using System.Text.RegularExpressions;...Regex regex =newRegex("foo");string result = regex.Replace("foo1 foo2 foo3 foo4","bar",1);// result = "bar1 foo2 foo3 foo4"
El tercer parámetro, establecido en 1 en este caso, es el número de apariciones del patrón de expresiones regulares que desea reemplazar en la cadena de entrada desde el principio de la cadena.
Tenía la esperanza de que esto se pudiera hacer con un Regex estático. Reemplace la sobrecarga, pero desafortunadamente parece que necesita una instancia de Regex para lograrlo.
Una de las sobrecargas de Regex.Replacetoma un intpara "El número máximo de veces que puede ocurrir el reemplazo". Obviamente, usar el Regex.Replacereemplazo de texto sin formato puede parecer excesivo, pero ciertamente es conciso:
Respuestas:
Ejemplo:
EDITAR : Como mencionó @itsmatt , también está Regex.Replace (String, String, Int32), que puede hacer lo mismo, pero probablemente sea más costoso en tiempo de ejecución, ya que utiliza un analizador con todas las funciones donde mi método hace una búsqueda y tres cadenas concatenaciones.
EDIT2 : si esta es una tarea común, es posible que desee convertir el método en un método de extensión:
Usando el ejemplo anterior, ahora es posible escribir:
fuente
ReplaceFirst("oef", "œ", "i")
devuelve incorrectamente "ief" en lugar de "if". Consulte esta pregunta para obtener más información.String.IndexOf is culture specific.
. Más robusto para actualizarint pos = text.IndexOf(search, StringComparison.Ordinal);
.Como dijo itsmatt , Regex.Replace es una buena opción para esto, sin embargo, para que su respuesta sea más completa, la completaré con una muestra de código:
El tercer parámetro, establecido en 1 en este caso, es el número de apariciones del patrón de expresiones regulares que desea reemplazar en la cadena de entrada desde el principio de la cadena.
Tenía la esperanza de que esto se pudiera hacer con un Regex estático. Reemplace la sobrecarga, pero desafortunadamente parece que necesita una instancia de Regex para lograrlo.
fuente
"foo"
, pero querrás unnew Regex(Regex.Escape("foo"))
figurativo"foo"
.Eche un vistazo a Regex.Replace .
fuente
Teniendo en cuenta el "solo primero", quizás:
?
O más generalmente:
Luego:
fuente
encontrará primero
F
enInputString
y lo reemplazará conR
.fuente
result = (New Regex("F")).Replace(InputString, "R", 1)
Método de extensión C # que hará esto:
Disfrutar
fuente
En la sintaxis de C #:
fuente
Y como también hay que considerar VB.NET, me gustaría ofrecer:
fuente
Asume que
AA
solo necesita ser reemplazado si está al comienzo de la cadena:Si necesita reemplazar la primera aparición de
AA
, ya sea que la cadena comience con él o no, vaya con la solución de Marc.fuente
Una de las sobrecargas de
Regex.Replace
toma unint
para "El número máximo de veces que puede ocurrir el reemplazo". Obviamente, usar elRegex.Replace
reemplazo de texto sin formato puede parecer excesivo, pero ciertamente es conciso:fuente
Para cualquiera a quien no le importe una referencia
Microsoft.VisualBasic
, existe elReplace
Método :fuente
Este ejemplo abstrae las subcadenas (pero es más lento), pero probablemente sea mucho más rápido que una expresión regular:
fuente
fuente