字符在字典中未正确转义

本文关键字:转义 字典 字符 | 更新日期: 2023-09-27 18:19:08

>我有一个这样的字符串:

Hello[00]
我想用 00

替换 [00](我不想通过删除 [] 来做到这一点,因为这以后对我没用(。我想要从 [00] 到 00 的直接替换。为此,我有以下代码:

            var conversionRegex = new Regex(string.Join("|", conversion.Keys));
            var textConverted = conversionRegex.Replace(allLines, n => conversion[n.Value]);

"转换"是一个字典[字符串],[字符串]。它的一个条目是这个:

{@"'[00']","00"}

根据我的知识和经验,这应该可以正常工作,但事实并非如此。它会引发异常:在字典中找不到密钥。但是,当引发异常时,调试器说"n.Value"等于"[00]"。所以它应该在字典中找到,因为它就在那里!

我在这个字典中有更多的元素,但唯一抛出异常的是那些应该转义的字符。不知何故,他们没有正确逃脱...

对此有什么想法吗?谢谢!

字符在字典中未正确转义

我认为您将正则表达式的转义与 C# 字符串文字的转义混淆了。 方括号 ([]( 在 C# 字符串文本中没有特殊含义,因此不需要转义。 但是,它们在正则表达式中确实具有特殊含义,因此如果您希望匹配这些字符,则需要在正则表达式字符串中对它们进行转义。 您的密钥已正确转义正则表达式,但这意味着您的 C# 字符串文本包含文本反斜杠字符。

下面是 C# 如何解释以下字符串文本:

  • "[00]" 是包含字符 [00] 的 4 个字符字符串。
  • "''[00'']" 是无效的 C#,因为 ''[ 和 ''] C# 字符串文本转义序列无效。 它不会编译。
  • @"''[00'']" 是一个包含字符 ''[00''] 的 6 个字符字符串。这是正则表达式转义的正确格式,但请务必认识到反斜杠是 C# 字符串文本的一部分,而不是 C# 转义序列的一部分。 这将不匹配"[00]",因为它们是不同的字符串。
  • "''''[00'''']"与上一个相同。 它不使用 @,而是使用 C# '''' 转义序列,该序列发出文本反斜杠字符。

当您使用 @"''[00'']" 作为字典键时,您的字典键包括那些反斜杠字符。 因此,您的字典不包含键"[00]"。

几种不同的方法可以重写代码来完成您尝试执行的操作。 这是一种简单的方法,即使用字符串表示形式而不使用正则表达式作为字典键进行转义,然后使用 Regex.Escape 转义这些来生成正则表达式字符串。

var conversion = new Dictionary<string, string> {
    { @"[00]", "00" }
};
var allLines = "Hello[00]'r'nWorld[00]";
var conversionRegex = new Regex(string.Join("|", conversion.Keys.Select(key => Regex.Escape(key))));
var textConverted = conversionRegex.Replace(allLines, n => conversion[n.Value]);
Console.WriteLine(textConverted);