Reemplace "\\" con "\" en una cadena en C#
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"?
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, stringToBeReplaced
solo 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.Length
y cuenta los personajes.
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"
Probé los procedimientos de tus publicaciones pero sin éxito.
Esto es lo que obtengo del depurador:
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 \r
y \n
es 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
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.