Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
384 / 184 / 107
Регистрация: 07.01.2016
Сообщений: 496
.NET 4.x

Оптимизация имен значений enum с Regex

05.06.2021, 13:09. Показов 2026. Ответов 7

Студворк — интернет-сервис помощи студентам
есть код множества перечислений...
C#
1
2
3
4
5
6
7
8
9
10
  enum E0
  {
    E0_V0,
    E0_V1
  }
  enum E1
  {
    E1_V0,
    E1_V1
  }
...у которых нужно убрать ненужный префикс в значениях:
C#
1
2
3
4
5
6
7
8
9
10
  enum E0
  {
    V0,
    V1
  }
  enum E1
  {
    V0,
    V1
  }
пока есть метод, но он работает немного сложновато - через создание дополнительного Regex для каждого Match:
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    public static void M()
    {
      string text = @"
  enum E0
  {
    E0_V0,
    E0_V1
  }
  enum E1
  {
    E1_V0,
    E1_V1
  }";
      Regex InnerRegex(string enumName) => new Regex(enumName + @"_([^\s]+)");
      var regex = new Regex(@"enum\s+([^\s]+)\s*\{[^\}]*\}", RegexOptions.Multiline);
      var newStr = regex.Replace(text, m =>
      {
        var innerRegex = InnerRegex(m.Groups[1].Value);
        return innerRegex.Replace(m.Groups[0].Value, "$1");
      });
    }

возможно ли сделать это с помощью одного Regex?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.06.2021, 13:09
Ответы с готовыми решениями:

enum - объявление перечисления в пространстве имен
Вечер добрый. Столкнулся с такой вот проблемой... На ночь глядя... Модуль_1.h namespace Visit { enum Type { ...

Почему перечисления enum объявляются в пространстве имен а не, например, в классе?
Совсем недавно взялся я усиленно за C# и остановился на перечислениях. Почему они объявляются в пространстве имен а не например в классе?...

Правильные имена при использовании Enum - Как избежать конфликта имен
Здравствуйте, как избежать конфликта имен в таком случае? public class Worker { public enum Profession { Lawyer, TaxiDriver} ...

7
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
05.06.2021, 16:42
Попробуйте такой вариант
C#
1
text = Regex.Replace(text, @"\w+_", "");
1
384 / 184 / 107
Регистрация: 07.01.2016
Сообщений: 496
06.06.2021, 11:27  [ТС]
samana, спасибо за простоту. как сделать для варианта, когда есть подчеркивание в основной части:
C#
1
2
3
4
5
  enum E0
  {
    E0_V_V0,
    E0_V_V1
  }
?
0
 Аватар для diadiavova
7259 / 2606 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
06.06.2021, 11:43
Цитата Сообщение от alexus5 Посмотреть сообщение
как сделать для варианта, когда есть подчеркивание в основной части:
Наверно не худо было бы иметь больше информации о том, что именно надо удалять. Например, если это всегда начинается с E, а потом идут цифры, то там все совсем просто. Но если вначале идут алфавитно-цифровые символы кроме подчеркивания, а потом подчеркивание, то можно сделать как-то так \b[\w-[_]]+_
1
384 / 184 / 107
Регистрация: 07.01.2016
Сообщений: 496
06.06.2021, 12:21  [ТС]
diadiavova, например,
C#
1
2
3
4
5
6
7
8
9
10
11
12
  enum E0
  {
    E0_V_V0 // -> V_V0
  }
  enum E0
  {
    E0_1_1 // -> _1_1
  }  
  enum E0_E1
  {
    E0_E1_1_1 // -> _1_1
  }
получается удаляем имя перечисления из значений, если остается цифра, нужно оставить перед ней черту.

Добавлено через 14 минут
diadiavova, что за магия -[_] внутри набора символов, где про нее можно узнать?
0
 Аватар для diadiavova
7259 / 2606 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
06.06.2021, 13:53
Цитата Сообщение от alexus5 Посмотреть сообщение
что за магия -[_] внутри набора символов, где про нее можно узнать?
В документации все есть
Классы символов в регулярных выражениях .NET | Microsoft Docs.
В данном случае [\w-[_]] означает любой алфавитно-цифровой символ кроме подчеркивания.
Цитата Сообщение от alexus5 Посмотреть сообщение
получается удаляем имя перечисления из значений, если остается цифра, нужно оставить перед ней черту.
Можно это грубо сделать с помощью регулярок и дополнительной обработки. Только когда обрабатываешь таким образом код, никогда нельзя быть уверенным, что все сделал правильно и не будет каких-то непредвиденных ситуаций. Вместо этого лучше воспользоваться инструментами Roslyn, тогда будет возможность парсить код и работать непосредственно с AST.
По поводу грубого решения, ну вот например можно как-то так сделать
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
 
namespace ConsoleAppCS
{
    class Program
    {
        static void Main(string[] args)
        {
            var input = @"
  enum E0
  {
    E0_V_V0 // -> V_V0
  }
  enum E0
  {
    E0_1_1 // -> _1_1
  }  
  enum E0_E1
  {
    E0_E1_1_1 // -> _1_1
  }";
            Console.WriteLine(DelEnumName(input));
            Console.ReadKey();
        }
 
        static string DelEnumName(string input)
        {
            var enumNameRE = new Regex(@"enum\s+([\w-\d][\w]*)[^\{]*\{([^\}]*)\}", RegexOptions.Singleline);
            var enums = enumNameRE.Matches(input);
            var sb = new StringBuilder();
 
            sb.Append(input);
            foreach(Match m in enums)
            {
                var name = m.Groups[1].Value;
                var code = m.Groups[2];
                var rcode = Regex.Replace(code.Value, @"\b" + Regex.Escape( name) + @"_(\w+)\b",mm=>(char.IsDigit(mm.Groups[1].Value[0])? "_":"") + mm.Groups[1].Value);
                sb.Replace(code.Value, rcode);
            }
            return sb.ToString();
 
        }
 
    }
}
Здесь из кода выдираются отдельные перечисления, вычисляется имя и код в фигурных скобках. Далее в коде выполняется замена слов, начинающихся с имени перечисления, после чего в тексте код перечисления заменяется измененным кодом с помощью реплейса. Но полагаться на это я бы не стал. Можно, конечно и еще придумать что-то, чтобы это было более надежно, но я все-таки считаю, что нужен полноценный парсер.
1
384 / 184 / 107
Регистрация: 07.01.2016
Сообщений: 496
07.06.2021, 10:16  [ТС]
Цитата Сообщение от diadiavova Посмотреть сообщение
никогда нельзя быть уверенным, что все сделал правильно и не будет каких-то непредвиденных ситуаций.
да, это правда, пример - не думал, что основная часть имени может начинаться с числа, выяснил случайно при листинге.
Цитата Сообщение от diadiavova Посмотреть сообщение
По поводу грубого решения, ну вот например можно как-то так сделать
интерес заключается как раз в этом "грубом" решении. тема регулярок в текущем контексте - ключевая. изначально у меня было решение в топике, но оно какое-то не очень красивое. сейчас главный вопрос - как решить данную задачу при помощи одной регулярки?.. либо понять, что это невозможно.
0
 Аватар для diadiavova
7259 / 2606 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
07.06.2021, 12:02
Лучший ответ Сообщение было отмечено alexus5 как решение

Решение

Цитата Сообщение от alexus5 Посмотреть сообщение
сейчас главный вопрос - как решить данную задачу при помощи одной регулярки?
Ну, если хорошо подумать, то вот что у меня получилось и вроде работает, но опять-таки, это все ненадежно.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
 
namespace ConsoleAppCS
{
    class Program
    {
        static void Main(string[] args)
        {
            var input = @"
  enum E0
  {
    E0_V_V0,
    E0_V_V1,
    E0_V_V2
  }
  enum E0
  {
    E0_1_1,
    E0_1_2,
    E0_1_3
  }  
  enum E0_E1
  {
    E0_E1_1_1
  }";
            Console.WriteLine(DelEnumName(input));
            Console.ReadKey();
        }
 
        static string DelEnumName(string input)
        {
            var re = new Regex(@"(?<=enum\s*(?<enumname>\w+)\s+\{\s*[^\{\}]*)(?<item>\k<enumname>_(?<newname>\w+))*", RegexOptions.Singleline);
            return re.Replace(input, m => {
                if (!m.Groups["newname"].Success) return m.Value;
                return (char.IsDigit(m.Groups["newname"].Value[0]) ? "_" : "") + m.Groups["newname"].Value;
            });
        }
 
    }
}
Выводит следующее

enum E0
{
V_V0,
V_V1,
V_V2
}
enum E0
{
_1_1,
_1_2,
_1_3
}
enum E0_E1
{
_1_1
}
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.06.2021, 12:02
Помогаю со студенческими работами здесь

Несколько значений Enum
Здравствуйте. Как присвоить несколько значений в enum? public enum KeysTest { A = 1 | 2 | 3 } //*** //Все...

Вывод значений Enum
вот есть у меня такой enum ColorType { black, white, green, yellow = 13, red, rose = 15 };

RegEx: Поиск значений
В текстовом файле, все строки, разной длины. В строках имеются - спец-символы, буквы, цифры и пробелы... Пример строк: 'a1~a1.aa'...

Datagridviewcomboboxcolumn + Сопоставление значений из enum
Доброго времени суток. У меня есть DataGridView привязанный через BindingSource к таблице БД. В таблице есть поля типа int и в нём...

определение значений из строки по regex
У меня есть строка неопределенной длины. Записанна она как: слово1 пробел слово2 пробел ...словоN пробел ... ( строго 1 пробел) Мне нужно...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru