Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# для начинающих

Войти
Регистрация
Восстановить пароль
 
ata
268 / 240 / 53
Регистрация: 28.10.2015
Сообщений: 709
#1

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

28.01.2017, 10:04. Просмотров 133. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Регулярное выражение с группами внутри групп (C#):

Регулярное выражение - C#
регулярка: &quot;\\b&quot; + blue + &quot;\\b&quot;, ищет слова, которые компилятор выделяет синим цветом.. blue - это массив, в котором содержатся те...

Регулярное выражение - C#
Как составить регулярное выражение чтобы получить слово &quot;поезд&quot;(но там будут другие слова) из следующей строки: ...

Регулярное выражение - C#
Здраствуйте, помогине пожалуйста есть html код : Нужно вытащить слова крассного цвета, пытался делать public string...

Регулярное выражение - C#
Если строка выглядит так, &quot;123;-123;4454;-123123;&quot;, то можно продолжать программу, а если &quot;123;-12-3;4вasd5ррова4;-123123;&quot;, то нельзя как...

Регулярное выражение - C#
Приветствую. Помоги составить регулярное выражение чтобы оно могло определить выражения: c:=a+b; c := a + b; c:=(a+b)*c; Под...

Регулярное выражение - C#
Выделить пользователей с именами, являющимися частью отчества, например: Boris Borisovich. Помогите составить регулярное выражение. ...

3
diadiavova
1851 / 987 / 274
Регистрация: 11.04.2015
Сообщений: 1,832
Записей в блоге: 31
28.01.2017, 12:17 #2
ata, у метода Replace для регулярок есть перегрузка, принимающая в качестве замены не строку, а специальный делегат. В нем можно реализовать проверку заменяемого фрагмента и текст замены выдавать по результатам этой проверки.
0
ata
268 / 240 / 53
Регистрация: 28.10.2015
Сообщений: 709
28.01.2017, 12:28  [ТС] #3
Это я знаю. Можно разбить строку на слова с помощью Split или регулярного выражения, а каждое слово обрабатывать внутри делегата другим регулярным выражением. Но мне было любопытно, можно ли все это сделать одним регекспом.
0
diadiavova
1851 / 987 / 274
Регистрация: 11.04.2015
Сообщений: 1,832
Записей в блоге: 31
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
28.01.2017, 13:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2017, 13:07
Привет! Вот еще темы с ответами:

Регулярное выражение - C#
Парсю файл html string regul = ...

Регулярное выражение - C#
есть строка вида Thread id=&quot;9&quot; time=&quot;3333.438&quot; нужно заменить значение time на своё делаю заменой с помощью регулярки: ...

Регулярное выражение - C#
Как на языке regexp выразить мысль &quot;любая буква, кроме X&quot; не прибегая к извращениям вроде

Регулярное выражение - C#
Есть строки такого вида 1 Kilburn NW6 United Kingdom England Greater London 51.553/-0.192 2 Ealing W5 United...


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

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

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