Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
ata
270 / 242 / 186
Регистрация: 28.10.2015
Сообщений: 709
1

Регулярное выражение с группами внутри групп

28.01.2017, 10:04. Просмотров 157. Ответов 3
Метки нет (Все метки)

И снова я с регулярными выражениями. Допустим, я хочу добавить ко всем словам восклицательные знаки и заменить все гласные на * (кроме A и a, которые заменяются на @). Я пытался написать что-то вроде @"(\b\w+\b)|([aeiou])" или @"(\b\w*([aeiou])\w*\b)" - ничего не получается. Через LINQ написал, но если бы через Regex получилось, то выглядело бы, конечно, проще, что-то вроде "группа 1 заменяется на $1!!!!", "группа 2 - на @", а "группа 3 - на *". Или я слишком многого хочу от регулярных выражений?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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"));
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.01.2017, 10:04
Ответы с готовыми решениями:

Регулярное выражение
Суть такова нужно найти процент схожести шаблона в тексте текст :...

Регулярное выражение
Приветствую. Помоги составить регулярное выражение чтобы оно могло определить...

Регулярное выражение
Уже битый час ломаю голову, не пойму как в конце написать регулярное выражение...

Регулярное выражение
Не могу разобраться, что означает данное выражение ( - любой символ из скобок,...

Регулярное выражение
Regex dataRegex3 = new Regex(@&quot;Регулярка&quot;); string str3 =...

3
diadiavova
3771 / 1325 / 415
Регистрация: 11.04.2015
Сообщений: 2,469
Записей в блоге: 35
28.01.2017, 12:17 2
ata, у метода Replace для регулярок есть перегрузка, принимающая в качестве замены не строку, а специальный делегат. В нем можно реализовать проверку заменяемого фрагмента и текст замены выдавать по результатам этой проверки.
0
ata
270 / 242 / 186
Регистрация: 28.10.2015
Сообщений: 709
28.01.2017, 12:28  [ТС] 3
Это я знаю. Можно разбить строку на слова с помощью Split или регулярного выражения, а каждое слово обрабатывать внутри делегата другим регулярным выражением. Но мне было любопытно, можно ли все это сделать одним регекспом.
0
diadiavova
3771 / 1325 / 415
Регистрация: 11.04.2015
Сообщений: 2,469
Записей в блоге: 35
28.01.2017, 13:07 4
ata, видимо проще на примере показать.
C#
1
2
3
4
5
6
7
8
9
10
11
            var re = new Regex(@"(?<eow>\w\b)|(?<voice>[eiouEIOU])|(?<aa>[aA])");
            string input = "alsdfj roijsadio lafjlsakjdowfn";
            string output = re.Replace(input, m =>
            {
                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);
Вывод
alsdfj roijsadio lafjlsakjdowfn
@lsdfj! r**js@d*o! l@fjls@kjd*wfn!
Добавлено через 14 минут
Регулярка, которую я привел не есть решение описанной задачи, поскольку она не учитывает случаев, когда слово заканчивается гласной(это можно увидеть во втором слове, где буква o не была заменена, но я просто показал принцип, а так вообще эти случаи можно туда добавить, если это нужно. Единственное условие: случаи с гласными в конце надо написать вначале регулярки, поскольку иначе до них дело не дойдет.

Добавлено через 3 минуты
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
            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);
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2017, 13:07

Регулярное выражение
Помогите составить регулярное выражение для этой записи:...

Регулярное выражение
Нужна проверка на валидность введенной команды, допустимые варианты - 0, 1, 2,...

Регулярное выражение
Имеется текст, в нем есть сумма, разделенная произвольным кол-вом пробелов(2 3...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru