.NET Regex - заменить несколько символов одновременно без перезаписи? - PullRequest
1 голос
/ 13 июня 2010

Я реализую программу ac #, которая должна автоматизировать моно-буквенный шифр замещения.Функциональность, над которой я сейчас работаю, является самой простой: пользователь предоставит простой текст и зашифрованный алфавит, например:

Простой текст (ввод): ЭТО ТЕСТ

Алфавит шифра: A -> Y, H -> Z, I -> K, S -> L, E -> J, T -> Q

Текст шифра (вывод): QZKL KL QJLQ

Я думал об использовании регулярных выражений, так как некоторое время программировал на Perl, но я столкнулся с некоторыми проблемами на c #.Сначала я хотел бы знать, будет ли у кого-то предложение по регулярному выражению, которое заменит все вхождения каждой буквы на соответствующую букву шифра (предоставленную пользователем) сразу и без перезаписи.

Пример:

В этом случае пользователь предоставляет открытый текст "ТЕСТ", и на своем зашифрованном алфавите он хочет, чтобы все его T были заменены на E, E заменены на Y, а S - на J. Моя первая мысль состояла в том, чтобы заменить каждыйвхождение буквы с отдельным символом, а затем заменить этот символ на шифр, соответствующий предоставленной в виде простого текста.

Используя то же слово в качестве примера "ТЕСТ", шаги, предпринятые программой для предоставления ответа, будут:

  1. заменить T на (скажем) @
  2. заменить E на #
  3. заменить S на &
  4. Заменить @ на E, #с Y и с J
  5. Выходные данные = EYJE

Это решение не работает для больших текстов.Я хотел бы знать, может ли кто-нибудь придумать одно регулярное выражение, которое позволило бы мне заменить каждую букву в данном тексте на соответствующую букву в 26-буквенном алфавите шифра без необходимости разбивать задачу на промежуточный этап, пока я

Если это помогает визуализировать процесс, это экран печати моего графического интерфейса программы: альтернативный текст http://img43.imageshack.us/img43/2118/11618743.jpg

Ответы [ 2 ]

3 голосов
/ 13 июня 2010

Вы также можете составить карту исходных символов и символов назначения, а затем просто перебрать строку и заменить по мере необходимости:

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 голос
/ 13 июня 2010

Я не думаю, что регулярные выражения являются правильным инструментом здесь. В 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();
}

Исходный код является модифицированной версией этого ответа из этого похожего вопроса . Ответы там показывают некоторые другие способы сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...