【问题标题】:Replace "\\" with "\" in a string in C#在 C# 中将字符串中的“\\”替换为“\”
【发布时间】:2024-01-24 05:41:01
【问题描述】:

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

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

标签: c# string replace backslash


【解决方案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 方法执行以下两种转换之一:

      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

      【讨论】:

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

      试试 -

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

      【讨论】:

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

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

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

            【解决方案9】:

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

             @"C:\Users\me\path"
            

            【讨论】:

              最近更新 更多