.NET Regex - 一次替换多个字符而不覆盖?

时间:2010-06-13 09:00:45

标签: c# .net regex encryption replace

我正在实现一个应该自动化单字母替换密码的c#程序。 我目前正在处理的功能是最简单的:用户将提供纯文本和密码字母,例如:

纯文本(输入):这是测试

密码字母:A - > Y,H - > Z,I - > K,S - > L,E - > J,T - > Q

密文(输出):QZKL KL QJLQ

我想过使用正则表达式,因为我已经在perl中编程了一段时间,但是我在c#上遇到了一些问题。 首先,我想知道是否有人会建议使用正则表达式来替换所有出现的每个字母的相应密码字母(由用户提供),而不会覆盖任何内容。

实施例

在这种情况下,用户提供明文“TEST”,并且在他的密码字母表中,他希望将他的所有T替换为E,用Y替换E替换为J.并且用J替换为J.我的第一个想法是替换每次出现的带有单个字符的字母,然后用与所提供的明文字母对应的密码替换该字符。

使用相同的示例单词“TEST”,程序提供答案的步骤如下:

  1. 用(假设)@
  2. 替换T'
  3. 用#
  4. 替换E ..
  5. 将&S替换为&
  6. 将@替换为E,将#替换为Y,&与j
  7. 输出= EYJE
  8. 此解决方案似乎不适用于大型文本。 我想知道是否有人能想到一个正则表达式,它允许我用26个字母的密码字母替换给定文本中的相应字母而不需要在中间步骤中将任务分开,因为我提及。

    如果它有助于可视化过程,这是我的程序GUI的打印屏幕:alt text http://img43.imageshack.us/img43/2118/11618743.jpg

2 个答案:

答案 0 :(得分:3)

您还可以创建源到目标字符的映射,然后只需循环遍历字符串并随时替换:

Dictionary<char, char> replacements = new Dictionary<char, char>();

// set up replacement chars, like this
replacements['T'] = '@';
replacements['E'] = '#';
replacements['S'] = '&';
replacements['@'] = 'E';
replacements['#'] = 'Y';
replacements['&'] = 'J';

// actually perform the replacements
char[] result = new char[source.Length];
for (int i = 0; i < result.Length; i++) {
    result[i] = replacements[source[i]];
}

return new string(result);

答案 1 :(得分:1)

我不认为正则表达式是正确的工具。在Perl中,您将使用音译功能tr/TES/EYJ/。 C#没有这个,但你可以通过使用StringBuilder并分别查看每个字符来实现。

private static string Translate(string input, string from, string to)
{
    StringBuilder sb = new StringBuilder();
    foreach (char ch in input)
    {
        int i = from.IndexOf(ch);
        if (i < 0)
        {
            sb.Append(ch);
        }
        else if (i < to.Length)
        {
            sb.Append(to[i]);
        }
    }
    return sb.ToString();
}

源代码是来自this answerthis similar question的修改版本。那里的答案显示了其他一些方法。