46

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

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

4

9 回答 9

85

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

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

如果您真的想用单个反斜杠替换双反斜杠,这样做很容易:

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

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

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

于 2011-09-20T08:46:07.367 回答
17

万一有人被困住了,上面的答案都不起作用,下面是对我有用的。希望能帮助到你。

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"
于 2018-06-05T19:22:27.110 回答
7

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

这是我从调试器中得到的: 在此处输入图像描述

我保存到 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”之间换行。)

解决方案:

好的,这不可能用标准替换来做,因为\rand\n是一个字符。可以逐个字符替换字符串的一部分,但不能替换一个字符的“一半”。所以,我必须单独替换任何特殊字符,如下所示:

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

这为我产生了正确的结果:

b
a
于 2013-05-13T00:44:01.217 回答
5

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

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

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

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

于 2017-04-04T00:54:31.180 回答
2

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

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

  1. 它通过从该方法转义的每个字符中删除转义字符(“\”)来反转由 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

于 2020-01-10T12:33:36.447 回答
1

尝试 -

var newstring = @"a\\b".Replace(@"\\",@"\");
于 2011-09-20T08:48:40.983 回答
0
string a = @"a\\b";
a = a.Replace(@"\\",@"\");

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

于 2011-09-20T08:45:27.717 回答
0

您可以简单地在您的字符串中进行替换,例如

Str.Replace(@"\\",@"\");
于 2011-09-20T08:47:59.117 回答
0

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

 @"C:\Users\me\path"
于 2021-05-24T13:38:47.780 回答