Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:将单个/替换为*单个*\_C#_String_Replace - Fatal编程技术网

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)吗?酷-看起来很棒!我会尝试这种方法;它可能会让我不用编写自己的解析器:)(会通知你它是否有效!)谢谢!非常好!非常感谢这个解决方案。