簡體   English   中英

在 C# 中將字符串中的“\\\\”替換為“\\”

[英]Replace “\\” with “\” in a string in C#

我仍然不明白如何做到這一點。 我看到很多關於這個的帖子,但沒有一個解決方案對我有用。

我有一個名為“a\\\\b”的字符串。 我需要的結果是“a\\b”。 這是怎么做的?

我有一個文本文件,其中有一個數據庫連接字符串指向一個名為 - Server\\DbInstance 的實例

我的目標是在文本文件中進行字符串替換——用另一個值替換“Server\\DbInstance”,比如“10.11.12.13, 1200”。

所以我有:

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

這就是問題開始的地方。 我的 stringToBeReplaced 將始終為“Server\\\\DbInstance”,當我在文本文件中搜索此字符串時,搜索失敗,因為文本文件沒有字符串“Server\\\\DbInstance”; 相反,它只有“Server\\DbInstance”。 那么如何將“Server\\\\DbInstance”改為“Server\\DbInstance”呢?

我懷疑您的字符串實際上已經只包含一個反斜杠,但是您正在調試器中查看它,該調試器將它轉義為一種形式,該形式可以作為 C# 中的常規字符串文字有效。

如果在控制台或消息框中打印出來,它顯示的是兩個反斜杠還是一個?

如果您真的想用單個反斜杠替換雙反斜杠,這樣做很容易:

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

...但我的猜測是原始文件無論如何都不包含雙反斜杠。 如果這沒有幫助,請提供更多詳細信息。

編輯:為了回應編輯的問題,您的stringToBeReplaced只有一個反斜杠。真的。 無論你在哪里看到兩個反斜杠,那個觀眾都在逃避它。 字符串本身沒有兩個反斜杠。 檢查stringToBeReplaced.Length並計算字符數。

萬一有人遇到這個問題並且上面的答案都不起作用,下面是對我有用的。 希望能幫助到你。

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"

我嘗試了您帖子的程序,但沒有成功。

這是我從調試器中得到的:在此處輸入圖片說明

我保存到 sqlite 數據庫中的原始字符串是b\\r\\na .. 當我閱讀它們時,我得到b\\\\r\\\\na (調試器中的長度為 6: "b" "\\" "\\r" "\\" "\\n" "a" ) 然后我嘗試替換這個字符串,我再次得到長度為 6 的字符串(你可以在上圖中看到)。

我在我的測試表單中運行這個簡短的腳本,只有一個文本框:

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

我在文本框中得到了這個(所以,“b”和“a”之間沒有換行符:

b\r\na

Length: 6

我可以用這個字符串做什么來取消反斜杠? (我期待“b”和“a”之間的新線。)

解決方案:

好的,這不可能用標准替換來完成,因為\\r\\n是一個字符。 可以逐個字符地替換字符串的一部分,但不能替換一個字符的“一半”。 所以,我必須單獨替換任何特殊字符,如下所示:

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

這對我產生了正確的結果:

b
a

我遇到了同樣的問題,直到我讀到 Jon Skeet 關於調試器顯示單個反斜杠和雙反斜杠的答案,即使字符串可能有一個反斜杠。 我不知道。 所以我改變了我的代碼

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

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

這解決了問題。 注意:我正在連接和 R.Net,它在路徑字符串中使用單個正斜杠。

Regex.Unescape(string) 方法轉換輸入字符串中的任何轉義字符。

Unescape 方法執行以下兩種轉換之一:

  1. 它通過從 Escape 方法轉義的每個字符中刪除轉義字符 ("\\") 來反轉 Escape 方法執行的轉換。 其中包括 \\、*、+、?、|、{、[、(,)、^、$、.、# 和空格字符。 此外,Unescape 方法對右方括號 (]) 和右大括號 (}) 字符進行轉義。

  2. 它將逐字字符串文字中的十六進制值替換為實際的可打印字符。 例如,它將@"\\x07" 替換為"\\a",或將@"\\x0A" 替換為"\\n"。 它轉換為受支持的轉義字符,例如 \\a、\\b、\\e、\\n、\\r、\\f、\\t、\\v 和字母數字字符。

string str = @"a\\b\\c";
var output = System.Text.RegularExpressions.Regex.Unescape(str);

參考:

https://docs.microsoft.com/en-us/dotnet/api/system.text.regularexpressions.regex.unescape?view=netframework-4.8

嘗試 -

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

接受的解決方案有效,但我選擇了下面的實現。 我還意識到我引用了錯誤的路徑。 請務必檢查您正在使用的路徑。

 @"C:\Users\me\path"
string a = @"a\\b";
a = a.Replace(@"\\",@"\");

應該管用。 請記住,在 Visual STudio 手表中,“\\”已轉義,因此您會看到“\\”代替了單個字符。

你可以簡單地在你的字符串中做一個替換

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM