it-swarm.com.de

Ersetzen Sie "\\" durch "\" in einer Zeichenfolge in C #

Ich verstehe immer noch nicht, wie das geht. Ich habe viele Beiträge dazu gesehen, aber keine der Lösungen funktionierte für mich.

Ich habe eine Zeichenfolge namens "a \\ b". Das Ergebnis, das ich brauche, ist "a\b". Wie wird das gemacht?

Ich habe eine Textdatei, die eine Datenbankverbindungszeichenfolge hat, die auf eine Instanz namens "Server\DbInstance" verweist

Mein Ziel ist es, eine Zeichenkette in der Textdatei zu ersetzen. Ersetzen Sie "Server\DbInstance" durch einen anderen Wert, beispielsweise "10.11.12.13, 1200".

Also habe ich:

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

Hier beginnt das Problem. Mein stringToBeReplaced ist immer "Server \\ DbInstance". Wenn ich nach dieser Zeichenfolge in meiner Textdatei suche, schlägt die Suche fehl, da die Textdatei keine Zeichenfolge "Server \\ DbInstance" hat. Stattdessen hat es nur "Server\DbInstance". Wie kann man also "Server \\ DbInstance" in "Server\DbInstance" ändern?

34
Sandeep

Ich habe den Verdacht, dass Ihre Zeichenfolge bereits enthält eigentlich nur einen Backslash, aber Sie betrachten ihn im Debugger, der ihn für Sie in ein Formular entgeht, das als reguläres Zeichenfolgenliteral in C # gültig wäre.

Wenn Sie es in der Konsole oder in einem Meldungsfeld ausdrucken, wird es mit zwei oder einem umgekehrten Schrägstrich angezeigt?

Wenn Sie tatsächlich einen doppelten Backslash durch einen einzigen ersetzen möchten, ist dies einfach:

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

... aber ich vermute, dass das Original sowieso keinen doppelten Backslash enthält. Wenn dies nicht hilft, geben Sie bitte weitere Details an.

BEARBEITEN: Als Antwort auf die bearbeitete Frage hat Ihre stringToBeReplaced nur einen Backslash. Wirklich. Wo immer Sie zwei umgekehrte Schrägstriche sehen, flieht der Betrachter davor. Der String selbst hat keine zwei Backslashes. stringToBeReplaced.Length prüfen und die Zeichen zählen.

64
Jon Skeet

Ich habe die Prozeduren Ihrer Beiträge ausprobiert, aber ohne Erfolg.

Das ist was ich vom Debugger bekomme: enter image description here

Ursprünglicher String, den ich in die sqlite-Datenbank speichere, war b\r\na .. wenn ich sie lese, erhalte ich b\\r\\na (Länge im Debugger ist 6: "b" "\" "\r" "\" "\n" "a") ).

Ich führe dieses kurze Skript in meinem Testformular mit nur einem Textfeld aus:

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

und ich bekomme dies in einem Textfeld (also keine neuen Zeilenzeichen zwischen "b" und "a"):

b\r\na

Length: 6

Was kann ich mit diesem String tun, um den Backslash zu entschlüsseln? (Ich erwarte eine neue Linie zwischen "b" und "a".)

Lösung:

OK, dies ist beim Standard-Ersetzen nicht möglich, da \r und \n ein Zeichen sind. Es ist möglich, einen Teil der Zeichenfolge Zeichen für Zeichen zu ersetzen, aber nicht die Möglichkeit, "halben Teil" eines Zeichens zu ersetzen. Ich muss also jedes Sonderzeichen wie folgt ersetzen:

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

Dies führt zu einem korrekten Ergebnis für mich:

b
a
6
Atiris

falls sich jemand damit verklemmt hat und keine der oben genannten Antworten funktioniert hat, ist unten das, was für mich funktioniert hat. Ich hoffe es hilft.

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

Versuchen - 

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

sollte funktionieren . Denken Sie daran, dass Visual STudio in der Uhr das "\" escaped zeigt, so dass Sie "\" anstelle eines einzelnen sehen.

0
Felice Pollano

Sie können einfach einen Ersatz in Ihrer Zeichenfolge machen

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

Ich hatte das gleiche Problem, bis ich Jon Skeets Antwort über den Debugger las, der einen einzelnen Backslash mit einem doppelten Backslash zeigte, obwohl die Zeichenfolge einen einzelnen Backslash aufweisen kann. Mir war das nicht bewusst ... Also habe ich meinen Code von geändert 

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

zu

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

und das hat das Problem gelöst. Hinweis: Ich arbeite und R.Net, das einzelne Schrägstriche in Pfadfolgen verwendet.

0