我有一个这样的字符串:
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]”。所以它应该在字典中找到,因为它就在那里!
我在这个词典中有更多元素,但是唯一抛出异常的元素是那些应该被转义的字符。不知何故,他们没有正确逃脱......
有关于此的任何想法吗?非常感谢你!
答案 0 :(得分:5)
我认为你因为逃避C#字符串文字而逃避正则表达式而感到困惑。方括号([])在C#字符串文字中没有特殊含义,因此不需要进行转义。但是,它们在正则表达式中确实具有特殊含义,因此如果您希望匹配这些字符,则需要在正则表达式字符串中进行转义。您的密钥已正确转义为正则表达式,但这意味着您的C#字符串文字包含文字反斜杠字符。
以下是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);