以最快的方式替换文件中的特殊字符?

时间:2018-05-13 05:46:39

标签: c# regex unicode-string

我有一些文件包含é,ã,Δ,Ù等特殊字符。我想将它们替换为NCR(十六进制)4位数值。我已经尝试过以下方法,但不确定这是否是实现目标的最快方式......

var entities = new[]
{
new { ser = "\u00E9", rep = @"é" },
new { ser = "\u00E3", rep = @"ã" },
new { ser = "\u00EA", rep = @"ê" },
new { ser = "\u00E1", rep = @"á" },
new { ser = "\u00C1", rep = @"Á" },
new { ser = "\u00C9", rep = @"É" },
new { ser = "\u0394", rep = @"Δ" },
new { ser = "\u03B1", rep = @"α" },
new { ser = "\u03B2", rep = @"β" },
new { ser = "\u00B1", rep = @"±" },
//... so on
};

var files = Directory.GetFiles(path, "*.xml");
foreach (var file in files)
{
    string txt = File.ReadAllText(file);

    foreach (var entity in entities)
    {
        if (Regex.IsMatch(txt, entity.ser))
        {
            txt = Regex.Replace(txt, entity.ser, entity.rep);
        }
    };
    File.WriteAllText(file, txt);
}

有更快捷的方法和更有效的方法吗?

1 个答案:

答案 0 :(得分:0)

根据评论,您希望将Unicode字符(例如Ù)替换为其Unicode值(&#x00D9)。 Regex.Replace可能是实现这一目标的最佳方式。

以下是处理文件的循环:

var files = Directory.GetFiles(path, "*.xml");
foreach (var file in files)
{
    string txt = File.ReadAllText(file);

    string newTxt = Regex.Replace(
        txt,
        @"([^\u0000-\u007F]+)",
        HandleMatch);

    File.WriteAllText(file, newTxt);
}

以下是比赛评估员:

private static char[] replacements = new[]
{
    'ø',
    'Ù'
};

private static string HandleMatch(Match m)
{
    // The pattern for the Regex will only match a single character, so get that character
    char c = m.Value[0];

    // Check if this is one of the characters we want to replace
    if (!replacements.Contains(c))
    {
        return m.Value;
    }

    // Convert the character to the 4 hex digit code
    string code = ((int) c).ToString("X4");

    // Format and return the code
    return "&#x" + code;
}

在循环中,您只需要读入一次文件,然后Regex.Replace方法将处理输入中所有实例的替换。正则表达式的模式将匹配不在0x00 - 0x7f范围内的所有内容,这将是前255个字符(ASCII字符)。

如果您只需要替换特定的Unicode字符,则需要构建这些字符的列表,并根据该列表检查HandleMatch()函数中的“c”值。

对效果的评论 您正在尝试对一组文件执行选择性字符替换。至少,您必须将每个文件读入内存,然后检查每个字符以查看它是否符合您的标准。

更高效的选项可以构建一个字符查找表,然后是每个字符的替换字符串。如果你有一个需要更换的大型字符列表,那么这个表很快就会难以维护。你也可以在替换表中留下错误的风险,这将是更多的工作要找。