在 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# 中将字符串中的“\\”替换为“\”的主要内容,如果未能解决你的问题,请参考以下文章