web-dev-qa-db-fra.com

Remplacer "\\" par "\" dans une chaîne en C #

Je ne comprends toujours pas comment faire cela. J'ai vu de nombreux articles à ce sujet, mais aucune des solutions ne fonctionnait pour moi.

J'ai une chaîne appelée "a \\ b". Le résultat dont j'ai besoin est "a\b". Comment est-ce fait?

J'ai un fichier texte qui a une chaîne de connexion de base de données pointant vers une instance appelée - Server\DbInstance

Mon objectif est de remplacer la chaîne "Serveur\DbInstance" par une autre valeur, telle que "10.11.12.13, 1200" dans le fichier texte.

Donc j'ai:

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

C'est là où commence le problème. Mon stringToBeReplaced sera toujours "Server \\ DbInstance" et lorsque je recherche cette chaîne dans mon fichier texte, la recherche échoue car le fichier texte ne contient pas de chaîne "Server \\ DbInstance"; au lieu de cela, il ne contient que "Server\DbInstance". Alors, comment changer "Server \\ DbInstance" en "Server\DbInstance"?

34
Sandeep

Je soupçonne que votre chaîne contient déjà en fait ne contient qu'une seule barre oblique inverse, mais vous la regardez dans le débogueur qui la sauvegarde pour vous dans un formulaire qui serait valide comme un littéral de chaîne normal en C #.

Si vous l'imprimez dans la console ou dans une boîte de message, est-ce que cela s'affiche avec deux barres obliques inverses ou une?

Si vous en fait voulez remplacer une double barre oblique inversée par une seule, c'est facile à faire:

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

... mais je suppose que l'original ne contient de toute façon pas une double barre oblique inversée. Si cela ne vous aide pas, veuillez donner plus de détails.

EDIT: En réponse à la question modifiée, votre stringToBeReplaced n'a qu'une seule barre oblique inversée. Vraiment. Partout où vous voyez deux barres obliques inverses, le téléspectateur y échappe. La chaîne elle-même n'a pas deux barres obliques inverses. Examinez stringToBeReplaced.Length et comptez les caractères.

64
Jon Skeet

J'ai essayé les procédures de vos messages mais sans succès.

Voici ce que je reçois du débogueur: enter image description here

La chaîne originale que j’ai sauvegardée dans la base de données sqlite était b\r\na .. quand je les lis, j’obtiens b\\r\\na (la longueur dans le débogueur est 6: "b" "\" "\r" "\" "\n" "a") puis j’essaie de remplacer cette chaîne et j’obtiens une chaîne de longueur 6 (vous pouvez voir l’image ci-dessus) ).

Je lance ce court script dans mon formulaire de test avec une seule zone de texte:

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();
    }

et je reçois cela dans la zone de texte (donc, pas de caractères de nouvelle ligne entre "b" et "a":

b\r\na

Length: 6

Que puis-je faire avec cette chaîne pour annuler la barre oblique inverse? (J'attends une nouvelle ligne entre "b" et "a".)

Solution:

OK, cela n’est pas possible avec le remplacement standard, car \r et \n a un caractère. Il est possible de remplacer une partie de la chaîne caractère par caractère, mais pas de remplacer "demi-partie" d'un caractère. Donc, je dois remplacer n'importe quel caractère spécial séparément, comme ceci:

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

Cela produit un résultat correct pour moi:

b
a
6
Atiris

au cas où quelqu'un resterait coincé avec cela et qu'aucune des réponses ci-dessus ne fonctionne, voici ce qui a fonctionné pour moi. J'espère que ça aide.

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"
2
niki b

Essayer - 

var newstring = @"a\\b".Replace(@"\\",@"\");
1
ipr101
string a = @"a\\b";
a = a.Replace(@"\\",@"\");

devrait fonctionner . N'oubliez pas que dans la montre, Visual Studio montre le "\" échappé de sorte que vous voyez "\" au lieu d'un seul.

0
Felice Pollano

Vous pouvez simplement faire un remplacement dans votre chaîne comme

Str.Replace(@"\\",@"\");
0
Mehran

J'avais le même problème jusqu'à ce que je lise la réponse de Jon Skeet à propos du débogueur affichant une simple barre oblique inverse avec une double barre oblique inverse, même si la chaîne peut avoir une seule barre oblique inverse. Je n'étais pas au courant de cela . Alors j'ai changé mon code de 

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

à

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

et cela a résolu le problème. Remarque: je suis en interface avec R.Net qui utilise des barres obliques simples dans les chaînes de chemin.

0
WalterWeinzinger