c# - 字典中的字符未正确转义

标签 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"是一个字典 [string],[string]。它的条目之一是这个:

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

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

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

对此有什么想法吗?非常感谢!

最佳答案

我认为您混淆了正则表达式的转义和 C# 字符串文字的转义。方括号 ([]) 在 C# 字符串文字中没有特殊含义,因此不需要转义。但是,它们在正则表达式中具有特殊含义,因此如果您希望匹配这些字符,则需要在正则表达式字符串中对它们进行转义。您的 key 已针对正则表达式进行了正确转义,但这意味着您的 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);

关于c# - 字典中的字符未正确转义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33319936/

相关文章:

Python 数学正则表达式

c# - WinForms ListView.HideSelection 属性没有效果?

c# - 文件流或 WebClient

c# - 尝试从 FitNesse REST URI 读取响应时出现连接关闭错误

c# - 启动新进程

c# - 在 C# .NET 中为蓝牙创建虚拟 COM 端口

regex - MongoDB搜索和排序,具有匹配数和完全匹配

c# - 我有一个逗号分隔的字符串,我想在 C# 中使用 Regex 查找其中的一个特定字段

c# - 找不到方法 : 'Void DotNetNuke.Framework.PageBase.set_HeaderIsWritten(Boolean)'

C# MongoDB 驱动程序 - 如何按数组和项目列表进行过滤