Регулярные выражения - сохранение регистров заменяемых символов - 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);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д