我正在实现一个 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”,程序提供答案所采取的步骤是:
- 将 T 替换为(比方说)@
- 用#替换E
- 用&替换S
- 将@替换为E,将#替换为Y,将&替换为j
- 输出 = EYJE
此解决方案似乎不适用于大文本。 我想知道是否有人能想到一个正则表达式,它允许我用 26 个字母的密码字母表中相应的字母替换给定文本中的每个字母,而不需要在中间步骤中拆分任务,因为我提到。
如果它有助于可视化过程,这是我的程序 GUI 的打印屏幕:alt text http://img43.imageshack.us/img43/2118/11618743.jpg
最佳答案
您还可以制作源字符到目标字符的映射,然后简单地循环遍历字符串并随时替换:
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);
关于c# - .NET Regex - 一次替换多个字符而不覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3031648/