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

49

我还是不太明白怎么做。我看了很多关于这个问题的帖子,但是没有一个解决方案适用于我。

我有一个名为"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"?


3
你需要一个字符串的值是"a\b",或者在打印时输出为"a\b"的字符串吗? - Olle89
9个回答

90

我怀疑您的字符串已经实际上只包含一个反斜杠,但您正在使用调试器查看它,调试器将其转义为在C#中作为普通字符串字面量有效的形式。

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

如果您实际上想用单个反斜杠替换双反斜杠,那么很容易做到:

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

...但我猜原始文本中根本没有双反斜杠。 如果这没有帮助,请提供更多细节。

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


7
对不起,仍然对我不起用:( 我已经更新了我的问题并说明了当前情况。 - Sandeep
1
@user762730:您展示的字符串中只有一个反斜杠。您没有清楚地说明您是如何看到它有两个反斜杠,但实际上只有一个。您仍然在调试器中查看吗? - Jon Skeet
1
好的。如果它真的只是一个斜杠,那么为什么这个字符串没有在文本文件中被替换??我需要做些其他的事情来替换这些东西吗?? - Sandeep
@user762730:你还没有展示给我们用于执行替换的代码,所以我们无法确定出了什么问题。 - Jon Skeet
3
问题已解决... 问题出在我进行的替换操作上。 我一开始使用了Regex.Replace来进行替换,而实际上应该使用string.Replace方法...使用 Regex.Replace(stringToBeReplaced, @"\\", @"\") 无法生效.. 使用 stringToBeReplaced.Replace(@"\\", @"\") 却可以...!!!! - Sandeep
如果stringToBeReplaced确实像您的示例代码中所示那样声明,那么这是没有意义的——因为您的代码实际上只有一个反斜杠。也许它并不真正代表您的真实代码? - Jon Skeet

19

如果有人遇到了这个问题,并且上面的答案都没有起作用,下面是对我有用的方法。希望能帮到你。

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"

7

我尝试了您的帖子中的步骤,但没有成功。

这是调试器给出的结果: enter image description here

我保存到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") 是有效的。请注意,只有要替换的文本前面有 @ 符号。 - Pierre

5

在阅读Jon Skeet关于调试器会将单个反斜杠显示为双反斜杠的答案之前,我一直遇到同样的问题。我之前不知道这一点。 因此,我根据其建议更改了代码:

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

to

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

这样问题就得到解决了。注意:我正在使用与单向斜杠路径字符串相对应的 R.Net 进行接口处理。


2
Regex.Unescape(string) 方法将输入字符串中的任何转义字符转换为其对应的字符。
Unescape 方法执行以下两种转换之一:
1. 它还原由 Escape 方法进行的转换,通过删除方法转义的每个字符的转义字符(“\”)来实现。这些字符包括 \、*、+、?、|、{、[、(、)、^、$、.、# 和空格字符。此外,Unescape 方法取消转义了闭括号(])和闭花括号(})字符。
2. 它使用实际可打印字符替换了文本字符串字面值中的十六进制值。例如,它用 "\a" 替换 @"\x07" 或用 "\n" 替换 @"\x0A"。它还将转换为支持的转义字符,如 \a、\b、\e、\n、\r、\f、\t、\v 和字母数字字符。
string str = @"a\\b\\c";
var output = System.Text.RegularExpressions.Regex.Unescape(str);

Reference:

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


虽然这个仅包含代码的答案可能解决了问题,但添加一些解释可以帮助其他用户理解解决方案并提高质量。 - CEH

1

尝试 -

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

0
你可以在字符串中简单地进行替换,例如:
Str.Replace(@"\\",@"\");

0
接受的解决方案是可行的,但我选择了下面的实现。我还意识到我引用了错误的路径。请务必检查您正在使用的路径。
 @"C:\Users\me\path"

0
string a = @"a\\b";
a = a.Replace(@"\\",@"\");

应该可以工作。 请记住,在观察窗口中,Visual Studio会显示“\”转义字符,因此您将看到一个“\”代替一个单独的“\”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接