【问题标题】:.NET Regex - Replace multiple characters at once without overwriting?.NET Regex - 一次替换多个字符而不覆盖?
【发布时间】:2010-06-13 09:00:44
【问题描述】:

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

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

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

密文(输出):QZKL KL QJLQ

自从我在 perl 中编程一段时间以来,我就想到了使用正则表达式,但是我在 c# 上遇到了一些问题。 首先,我想知道是否有人对正则表达式提出建议,该正则表达式将立即用其对应的密码字母(由用户提供)替换每个字母的所有出现且不覆盖任何内容。

示例:

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

使用相同的示例词“TEST”,程序提供答案所采取的步骤是:

  1. 将 T 替换为(比如说)@
  2. 将 E 替换为 #
  3. 将 S 替换为 &
  4. 将@替换为E,#替换为Y,&替换为j
  5. 输出 = EYJE

此解决方案似乎不适用于大文本。 我想知道是否有人能想到一个单一的正则表达式,它允许我用 26 字母密码字母表中的相应字母替换给定文本中的每个字母,而无需在中间步骤中拆分任务,因为我提到了。

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

【问题讨论】:

  • C# 不支持正则表达式。你问的是 .NET 正则表达式吗?
  • 我在 C# 中使用 System.Text.RegularExpressions 命名空间,但显然标记显示的解决方案更好。谢谢

标签: c# .net regex encryption replace


【解决方案1】:

您还可以制作源字符到目标字符的映射,然后简单地遍历字符串并随时替换:

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);

【讨论】:

  • 是的,这是另一个想法。比前一个效率低一点,但绝对比正则表达式更容易。
【解决方案2】:

我不认为正则表达式是正确的工具。在 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 answer 的修改版本this similar question。那里的答案显示了其他一些方法。

【讨论】:

  • 谢谢你,马克,我会看看你刚才提到的。我到处寻找 C# 的翻译功能,你刚刚证实了我所担心的。
  • 使用此解决方案效果很好。再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
  • 2016-11-05
  • 2011-08-07
相关资源
最近更新 更多