字符中的字符未正确转义

时间:2015-10-24 15:35:30

标签: c# .net regex

我有一个这样的字符串:

Hello[00]

我想用00替换[00](我不想通过删除[]来实现它,因为这对我以后没有用)。我希望从[00]到00直接替换。为此,我有以下代码:

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

“conversion”是Dictionary [string],[string]。其中一个条目就是这个:

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

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

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

有关于此的任何想法吗?非常感谢你!

1 个答案:

答案 0 :(得分:5)

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

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

  • “[00]”是包含字符[00]的4字符串。
  • 由于无效的\ [和\] C#字符串文字转义序列,
  • “\ [00 \]”是无效的C#。它不会编译。
  • @“\ [00 \]”是一个包含字符\ [00 \]的6个字符串。这是用于转义正则表达式的正确格式,但重要的是要认识到反斜杠是C#字符串文字的一部分而不是C#转义序列。这与“[00]”不匹配,因为它们是不同的字符串。
  • “\\ [00 \\]”与之前相同。它不使用@,而是使用C#\\转义序列,它会发出文字反斜杠字符。

当您使用@“\ [00 \]”作为字典键时,您的字典键包含这些键 反斜杠字符。因此,您的词典不包含键“[00]”。

您可以通过几种不同的方式重写代码以完成您要执行的操作。这是一个简单的方法,通过使用字符串表示而不使用正则表达式转义为dict键,然后使用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);