Регулярные выражения - сохранение регистров заменяемых символов - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Подскажите пожалуйста, возможно ли через Regex заменить символы с сохранением регистра оригинальных символов? Допустим, у нас есть некоторый текст, в котором присутствует ошибка и программе нужно её исправить. Для примера, пользователь написал "жызнь", а программа должна исправить это слово и вывести этот же текст. Т.е. вместо "жызнь" вывести "жизнь". Однако, пользователь может написать слово и всё в верхнем регистре(т.е. "ЖЫЗНЬ", а так же, написать в верхнем регистре только некоторые символы, т.е. "жЫзНь"). Ну и программа должна заменять ошибку в слове "ЖЫЗНЬ" на "ЖИЗНЬ". Однако, писать для каждого варианта написания отдельный System.Text.RegularExpressions.Regex довольно... "геморно". Есть ли способ попроще? Пока что, у меня выходит нечто подобное(но, как я уже написал-это несколько "неудобно", отдельно каждым Regex'ом сравнивать различные варианты регистров и т.д. и т.п.):
            Console.WriteLine("Введите строку, содержащую ошибку "ЖЫ", "ШЫ":");
            String _string = Console.ReadLine();
            System.Text.RegularExpressions.Regex _mainRegex = new System.Text.RegularExpressions.Regex(@"ЖЫ|ШЫ", System.Text.RegularExpressions.RegexOptions.IgnoreCase);//В данном случае-выполняем поиск по шаблону вне зависимости от регистра
            if (_mainRegex.IsMatch(_string))
            {
                Console.WriteLine("Эм... в тексте есть ошибка...");
                {
                    //А вот тут начинается...
                    System.Text.RegularExpressions.Regex _ЖЫ_Regex = new System.Text.RegularExpressions.Regex(@"ЖЫ");
                    System.Text.RegularExpressions.Regex _жы_Regex = new System.Text.RegularExpressions.Regex(@"жы");                    
                    System.Text.RegularExpressions.Regex _Жы_Regex = new System.Text.RegularExpressions.Regex(@"Жы");
                    System.Text.RegularExpressions.Regex _жЫ_Regex = new System.Text.RegularExpressions.Regex(@"жЫ");
                    //4 Regex'а только для "жи"...
 
                    System.Text.RegularExpressions.Regex _ШЫ_Regex = new System.Text.RegularExpressions.Regex(@"ШЫ");
                    System.Text.RegularExpressions.Regex _шы_Regex = new System.Text.RegularExpressions.Regex(@"шы");                    
                    System.Text.RegularExpressions.Regex _Шы_Regex = new System.Text.RegularExpressions.Regex(@"Шы");
                    System.Text.RegularExpressions.Regex _шЫ_Regex = new System.Text.RegularExpressions.Regex(@"шЫ");
 
                    if (_ЖЫ_Regex.IsMatch(_string)) Console.WriteLine(_ЖЫ_Regex.Replace(_string, "ЖИ"));
                    else if (_жы_Regex.IsMatch(_string)) Console.WriteLine(_жы_Regex.Replace(_string, "жи"));
                    else if (_Жы_Regex.IsMatch(_string)) Console.WriteLine(_жы_Regex.Replace(_string, "Жи"));
                    else if (_жЫ_Regex.IsMatch(_string)) Console.WriteLine(_жы_Regex.Replace(_string, "жИ"));
 
                    else if (_ШЫ_Regex.IsMatch(_string)) Console.WriteLine(_ШЫ_Regex.Replace(_string, "ШИ"));
                    else if (_шы_Regex.IsMatch(_string)) Console.WriteLine(_шы_Regex.Replace(_string, "ши"));
                    else if (_Шы_Regex.IsMatch(_string)) Console.WriteLine(_шы_Regex.Replace(_string, "Ши"));
                    else if (_шЫ_Regex.IsMatch(_string)) Console.WriteLine(_шы_Regex.Replace(_string, "шИ"));
                }
            }
            else Console.WriteLine("Вы ввели не верную строку для обработки...");
            Console.ReadKey();

Решение задачи: «Регулярные выражения - сохранение регистров заменяемых символов»

textual
Листинг программы
string failString = "жФзнь";
string mistakenLetter = "и";
string trueStr = Regex.Replace(failString, "(ж)([^" + mistakenLetter + "])(знь)", m =>
{
    return m.Groups[1].Value + (Char.IsUpper(m.Value, m.Groups[2].Index) ? mistakenLetter.ToUpper() : mistakenLetter.ToLower()) + m.Groups[3].Value;
}, RegexOptions.IgnoreCase);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.067 из 5
Похожие ответы