在 C# 中将字符串中的“\\”替换为“\”

Posted

技术标签:

【中文标题】在 C# 中将字符串中的“\\\\”替换为“\\”【英文标题】:Replace "\\" with "\" in a string in C#在 C# 中将字符串中的“\\”替换为“\” 【发布时间】:2011-11-20 21:27:24 【问题描述】:

我仍然不知道如何做到这一点。我看到了很多关于此的帖子,但没有一个解决方案对我有用。

我有一个名为“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”呢?

【问题讨论】:

您需要一个值为“a\b”的字符串还是在打印时写入“a\b”? 【参考方案1】:

我怀疑你的字符串已经 实际上 只包含一个反斜杠,但是你正在调试器中查看它,它正在为你转义为一个可以作为常规字符串文字有效的形式在 C# 中。

如果在控制台或消息框中打印出来,它会显示两个反斜杠还是一个?

如果您实际上想用一个单反斜杠替换双反斜杠,这样做很容易:

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

...但我的猜测是原件无论如何都不包含双反斜杠。如果这没有帮助,请提供更多详细信息。

编辑:针对已编辑的问题,您的 stringToBeReplaced 只有一个反斜杠。真的。无论您在哪里看到两个反斜杠,该查看器都在逃避它。字符串本身没有两个反斜杠。检查stringToBeReplaced.Length 并计算字符数。

【讨论】:

它仍然不适合我:(我已经用我目前的情况更新了这个问题。 @user762730:您显示的字符串中只有一个反斜杠。您还不清楚如何用两个反斜杠看到它,但它真的只有一个。您还在查看调试器吗? 好的。如果它真的只是一个斜杠,那么为什么这个字符串没有在文本文件中被替换???我需要做其他事情来代替这些东西吗?? @user762730:你没有向我们展示你用来执行替换的代码,所以我们无法判断出了什么问题。 解决了问题...问题出在我正在做的替换上。我正在执行 Regex.Replace。相反,我应该使用 string.Replace 方法... Regex.Replace(stringToBeReplaced, @"\\", @"\") 不起作用.. stringToBeReplaced.Replace(@"\\", @"\" ) 工作...!!!!【参考方案2】:

如果有人被这个问题困扰并且上面的答案都不起作用,下面是对我有用的方法。希望对您有所帮助。

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"

【讨论】:

【参考方案3】:

我尝试了你的帖子的程序,但没有成功。

这是我从调试器中得到的:

我保存到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

【讨论】:

"my\\r\\nstring".Replace(@"\r\n", "\r\n") 有效。请注意,只有要替换的文本前面有 @【参考方案4】:

我遇到了同样的问题,直到我阅读 Jon Skeet 关于调试器显示单个反斜杠和双反斜杠的答案,即使字符串可能有一个反斜杠。我没有意识到这一点。 所以我从

更改了我的代码
text2 = text1.Replace(@"\\", @"/");

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

这就解决了问题。 注意:我正在连接和 R.Net,它在路径字符串中使用单个正斜杠。

【讨论】:

【参考方案5】:

Regex.Unescape(string) 方法转换输入字符串中的任何转义字符。

Unescape 方法执行以下两种转换之一:

    它通过以下方式反转 Escape 方法执行的转换 从每个被转义的字符中删除转义字符(“\”) 方法。这些包括 \、*、+、?、|、、[、(,)、^、$、.、#、 和空白字符。此外,Unescape 方法 取消转义右括号 (]) 和右大括号 () 字符。

    它将逐字字符串文字中的十六进制值替换为 实际可打印的字符。例如,它替换 @"\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

【讨论】:

虽然这个纯代码答案可能会解决问题中的问题,但添加解释将有助于其他用户理解解决方案并提高质量。【参考方案6】:

试试 -

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

【讨论】:

【参考方案7】:
string a = @"a\\b";
a = a.Replace(@"\\",@"\");

应该可以。 请记住,在观看 Visual STudio 节目中,“\”已转义,因此您看到“\”代替了单个。

【讨论】:

【参考方案8】:

你可以简单地在你的字符串中做一个替换

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

【讨论】:

【参考方案9】:

接受的解决方案有效,但我选择了下面的实现。我也意识到我引用了错误的路径。请务必检查您使用的路径。

 @"C:\Users\me\path"

【讨论】:

以上是关于在 C# 中将字符串中的“\\”替换为“\”的主要内容,如果未能解决你的问题,请参考以下文章

如何在 html 字符串中将 http://localhost 替换为 ~/

在 C# Razor 中将字符串呈现为 HTML

在C#中将字符串转换为类型[重复]

如何在 C# 中将 .json 文件转换为字符串 [重复]

如何在 C# 中将字符串转换为字节 []

如何在 SQL 中将 null(数字)替换为“未知”(字符)?