Регулярное выражение с группами внутри групп - C#
Формулировка задачи:
И снова я с регулярными выражениями. Допустим, я хочу добавить ко всем словам восклицательные знаки и заменить все гласные на * (кроме A и a, которые заменяются на @). Я пытался написать что-то вроде @"(\b\w+\b)|([aeiou])" или @"(\b\w*([aeiou])\w*\b)" - ничего не получается. Через LINQ написал, но если бы через Regex получилось, то выглядело бы, конечно, проще, что-то вроде "группа 1 заменяется на $1!!!!", "группа 2 - на @", а "группа 3 - на *". Или я слишком многого хочу от регулярных выражений?
using System; using System.Linq; using System.Collections.Generic; public class Kata { private static Dictionary<char, char> d = new Dictionary<char, char>() { { 'A', '@' }, { 'E', '*' }, { 'I', '*' }, { 'O', '*' }, { 'U', '*' } }; public static string Gordon(string a) { return String.Join(" ", a.Split().Select(word => new String(word.Select(ch => { ch = Char.ToUpper(ch); char shout; return d.TryGetValue(ch, out shout) ? shout : ch; }) .Concat(Enumerable.Repeat('!', 4)).ToArray()))); } public static void Main() { Console.WriteLine(Gordon("What feck damn cake")); } }
Решение задачи: «Регулярное выражение с группами внутри групп»
textual
Листинг программы
var re = new Regex(@"(?<ea>[aA]\b)|(?<ev>[eiouEIOU]\b)|(?<eow>\w\b)|(?<voice>[eiouEIOU])|(?<aa>[aA])"); string input = "alsdfj roijsadio lafjlsakjdowfn"; string output = re.Replace(input, m => { if (m.Groups["ev"].Success) return "*!"; if (m.Groups["ea"].Success) return "@!"; if (m.Groups["eow"].Success) return m.Value + "!"; if (m.Groups["voice"].Success) return "*"; if (m.Groups["aa"].Success) return "@"; return ""; }); Console.WriteLine(input); Console.WriteLine(output);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д