4

我发现很多帖子回答了类似的问题(例如“如何替换\/”或“如何替换\\\”。我理解所有这些,但没有一个能解决我的特殊问题。这里是:

我正在从注册表中读取一个路径字符串,其中包含“ ///”而不是“ \”(易于替换),但也/u00xy包含 unicode 字符的“”。要使用正确的unicode字符成功解析字符串,我必须/将. 但是每一种可能的方式(或)都会导致“ ”而不是“ ”! \string.replaceregex.replace\\u00xy\u00xy

或者,我收到类似“ Unrecognized escape sequence”的错误。例如:

str.Replace("/u00", @"\u00")   // results in "\\u00"

同时:

str.Replace("/u00", "\u00")    // gives an error.

我没主意了!

4

2 回答 2

3

我相信这样的事情应该适合你:

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 所指出的,这不仅仅是用单个“\”替换“/”。你不能真正做到这一点,因为 '\' 是转义字符。首先,我们必须匹配组“/uXXXX”。然后我们将字符串十六进制部分(XXXX)转换为utf32(即unicode)中的整数。最后,我们得到了那个 utf32 编码对应的字符。

于 2012-11-05T17:42:17.403 回答
2

编辑:现在我明白你想要做什么了,它的工作原理一点也不奇怪。您不是在谈论字符串的“内部”表示 - 您实际上是在要求在执行时应用特定于 C# 的字符串文字解析规则。

如果你写:

string x = "\u0041";

... 创建一个包含单个字符 ('A') 的字符串。在原始源代码中它被表示为 Unicode 转义序列这一事实根本不会影响字符串。因此,上面的代码在执行时与以下代码无法区分:

string x = "A";

现在,听起来您想将包含斜杠、后跟 a u、后跟四个十六进制数字的字符串解析为单个字符。您必须自己执行此操作,或者找到另一个可以执行此操作的库 - 您不应该期望string.Replace为您执行此操作。

换句话说,了解数据本身与数据的源代码表示之间的区别至关重要。


您声称:

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 字符转义序列。

于 2012-11-05T17:08:03.550 回答