C#:将单个/替换为*单个*\
我发现很多帖子都回答了类似的问题(比如“如何用C#:将单个/替换为*单个*\,c#,string,replace,C#,String,Replace,我发现很多帖子都回答了类似的问题(比如“如何用/替换\”或者“如何用\替换\”。我理解所有这些问题,但没有一个能解决我的特殊问题。这里是: 我正在从注册表读取一个路径字符串,其中包含“//”而不是“\”(易于替换),还包含用于unicode字符的“/u00xy”。要成功地用正确的unicode字符解析字符串,我必须用一个\替换>。但要尽一切可能(string.replace或regex.replace)结果是“\\u00xy”而不是“\u00xy” 或者,我得到一个错误,如“无法识别的转义序列”
/
替换\
”或者“如何用\
替换\
”。我理解所有这些问题,但没有一个能解决我的特殊问题。这里是:
我正在从注册表读取一个路径字符串,其中包含“//
”而不是“\
”(易于替换),还包含用于unicode字符的“/u00xy
”。要成功地用正确的unicode字符解析字符串,我必须用一个\
替换>。但要尽一切可能(string.replace
或regex.replace
)结果是“\\u00xy
”而不是“\u00xy
”
或者,我得到一个错误,如“无法识别的转义序列”
”。例如:
str.Replace("/u00", @"\u00") // results in "\\u00"
同时:
str.Replace("/u00", "\u00") // gives an error.
我没有主意了!编辑:现在我明白你想做什么了,这一点也不奇怪。你说的不是字符串的“内部”表示,而是要求在执行时应用特定于C#的字符串文字解析规则
如果你写:
string x = "\u0041";
…创建一个包含单个字符('a')的字符串。在原始源代码中,它表示为Unicode转义序列这一事实根本不会影响该字符串。因此,在执行时,上述代码与以下代码无法区分:
string x = "A";
现在,听起来你想把一个包含斜杠的字符串,后跟一个u
,后跟四个十六进制数字,解析成一个字符。你必须自己做这件事,或者找另一个库来做这件事-你不应该指望字符串。替换来为你做这件事
换句话说,理解数据本身与数据的源代码表示之间的差异是至关重要的
你声称:
str.Replace("/u00", @"\u00")
结果为“\u00”
不,真的没有。如果你把结果写到控制台上,你会看到只有一个反斜杠
我强烈怀疑您正在调试器中查找,调试器显示一个转义视图
演示代码:
using System;
class Test
{
static void Main()
{
string input = "x/u00y";
string output = input.Replace("/u00", @"\u00");
Console.WriteLine(output); // Result: x\u00y
}
}
此代码:
str.Replace("/u00", "\u00")
确实会失败,因为字符串文字“\u00”
无效。这是一个未终止的Unicode字符转义序列。我相信类似的内容应该适合您:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Globalization;
namespace Test
{
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine(ConvertUnicodeEscapes("aa/u00C4bb/u00C4cc/u00C4dd/u00C4ee")); // prints aaÄbbÄccÄddÄee
}
private static Regex r = new Regex("/u([0-9A-F]{4})");
private static string ConvertUnicodeEscapes(string input)
{
return r.Replace(input, m => {
int code = int.Parse(m.Groups[1].Value, NumberStyles.HexNumber);
return char.ConvertFromUtf32(code).ToString();
} );
}
}
}
正如Jon指出的,这并不是简单地用单个“\”替换“/”。因为“\”是转义字符,所以不能这样做。首先,我们必须匹配组“/uxxx”。然后我们将字符串十六进制部分(XXXX)转换为utf32中的整数(即unicode)。最后,我们得到与utf32代码对应的字符。您在哪里观察到\\u00
结果?调试器是否可能在捉弄您?众所周知,调试器会这样做。+1.Visual Studio调试器中的悬停变量可视化程序将完全做到这一点,IIRC。您是否尝试转义反斜杠?=str.Replace(“/u00”,“\\u00”);我理解您的问题,我知道调试器会这样显示。问题是字符串本身肯定包含双反斜杠,我需要一个。请使用重现问题的str
值更新示例。(如var str=“x/u00y”
)并在结果字符串中显示每个字符的长度和值。谢谢,我看得很清楚。但不幸的是,这并不能解决我的问题。这是关于unicode序列的内部表示。在您的示例中,完整字符串将不显示unicode字符,而只显示“\u00C4”而不是Ä(例如)。以下是我的意思的一个示例:我从注册表读取的字符串可能是:“H/u00C4GAR”。这必须转换为“HÄGAR”。我正试图通过将字符串内部更改为“H\00C4GAR”来实现这一点。是否有更好的方法?(如果我无法正确描述我的问题,请抱歉!)+1.我认为在结果字符串中添加每个字符的转储可能是有益的。@WolfRuland:哦,在这种情况下,你根本不是在讨论.NET中的内部表示。你是在讨论特定于C的Unicode转义序列。你不能只替换字符串中的一个字符,而期望使用特定于C的解析规则谎言。你必须自己解析字符串。@WolfRuland,你想用对应于XXXX的字符替换自定义Unicode编码(/uxxx)吗?酷-看起来很棒!我会尝试这种方法;它可能会让我不用编写自己的解析器:)(会通知你它是否有效!)谢谢!非常好!非常感谢这个解决方案。