Reemplace "\\" con "\" en una cadena en C#

Resuelto Sandeep asked hace 12 años • 9 respuestas

Todavía no entiendo cómo hacer esto. Vi muchas publicaciones sobre esto, pero ninguna de las soluciones funcionó para mí.

Tengo una cadena llamada "a\\b". El resultado que necesito es "a\b". ¿Cómo se hace esto?

Tengo un archivo de texto que tiene una cadena de conexión de base de datos que apunta a una instancia llamada Server\DbInstance

Mi objetivo es reemplazar una cadena en el archivo de texto: reemplazar "Server\DbInstance" con otro valor, digamos "10.11.12.13, 1200".

Así que tengo:

stringToBeReplaced = @"Server\DbInstance";
newString = @"10.11.12.13, 1200";

Aquí es donde empieza el problema. Mi stringToBeReplaced siempre será "Server\\DbInstance", y cuando busco esta cadena en mi archivo de texto, la búsqueda falla, ya que el archivo de texto no tiene una cadena "Server\\DbInstance"; en su lugar, sólo tiene "Server\DbInstance". Entonces, ¿cómo se cambia "Servidor\\DbInstance" a "Servidor\DbInstance"?

Sandeep avatar Sep 20 '11 15:09 Sandeep
Aceptado

Sospecho que su cadena en realidad solo contiene una barra invertida, pero la está mirando en el depurador, que la está escapando en un formato que sería válido como una cadena literal normal en C#.

Si lo imprime en la consola o en un cuadro de mensaje, ¿se muestra con dos barras invertidas o una?

Si realmente desea reemplazar una barra invertida doble por una sola, es fácil hacerlo:

text = text.Replace(@"\\", @"\");

... pero supongo que el original no contiene una doble barra invertida de todos modos. Si esto no ayuda, proporcione más detalles.

EDITAR: En respuesta a la pregunta editada, stringToBeReplacedsolo tiene una barra invertida. De verdad. Dondequiera que veas dos barras invertidas, ese espectador se está escapando de ellas. La cadena en sí no tiene dos barras invertidas. Examina stringToBeReplaced.Lengthy cuenta los personajes.

Jon Skeet avatar Sep 20 '2011 08:09 Jon Skeet

En caso de que alguien se quede atascado con esto y ninguna de las respuestas anteriores funcionó, a continuación se muestra lo que funcionó para mí. Espero eso ayude.

var oldString = "\\r|\\n";

// None of these worked for me
// var newString = oldString(@"\\", @"\");
// var newString = oldString.Replace("\\\\", "\\");
// var newString = oldString.Replace("\\u5b89", "\u5b89");
// var newString = Regex.Replace(oldString , @"\\", @"\");

// This is what worked
var newString = Regex.Unescape(oldString);
// newString is now "\r|\n"
niki b avatar Jun 05 '2018 19:06 niki b

Probé los procedimientos de tus publicaciones pero sin éxito.

Esto es lo que obtengo del depurador: ingrese la descripción de la imagen aquí

La cadena original que guardé en la base de datos sqlite era b\r\na... cuando los leo, obtengo b\\r\\na(la longitud en el depurador es 6:) "b" "\" "\r" "\" "\n" "a", luego intento reemplazar esta cadena y obtengo una cadena con una longitud de 6 nuevamente (puede ver en la imagen de arriba).

Ejecuto este breve script en mi formulario de prueba con un solo cuadro de texto:

private void Form_Load(object sender, EventArgs e)
    {
        string x = "b\\r\\na";
        string y = x.Replace(@"\\", @"\");
        this.textBox.Text = y + "\r\n\r\nLength: " + y.Length.ToString();
    }

y obtengo esto en el cuadro de texto (por lo tanto, no hay caracteres de nueva línea entre "b" y "a":

b\r\na

Length: 6

¿Qué puedo hacer con esta cadena para eliminar la barra invertida? (Espero una nueva línea entre "b" y "a".)

Solución:

Bien, esto no es posible hacer con el reemplazo estándar, debido a que \ry \nes un carácter. Es posible reemplazar parte de la cadena carácter por carácter, pero no es posible reemplazar "la mitad" de un carácter. Entonces, debo reemplazar cualquier carácter especial por separado, así:

private void Form_Load(object sender, EventArgs e) {
    ...
    string z = x.Replace(@"\r\n", Environment.NewLine);
    ...

Esto produce el resultado correcto para mí:

b
a
Atiris avatar May 13 '2013 00:05 Atiris

Estaba teniendo el mismo problema hasta que leí la respuesta de Jon Skeet acerca de que el depurador muestra una sola barra invertida con una doble barra invertida, aunque la cadena puede tener una sola barra invertida. No era consciente de eso. Entonces cambié mi código de

text2 = text1.Replace(@"\\", @"/");

a

text2 = text1.Replace(@"\", @"/");

y eso resolvió el problema. Nota: Estoy interactuando con R.Net, que utiliza barras diagonales simples en las cadenas de ruta.

WalterWeinzinger avatar Apr 04 '2017 00:04 WalterWeinzinger