Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 28.05.2017
Сообщений: 13
1

Регулярное выражение по удалению комментариев (не задеть хинты)

25.12.2019, 08:58. Просмотров 1514. Ответов 12


Необходимо написать регулярное выражение для удаления многострочных комментариев вида /* COMMENT */, но при этом не должны удаляться хинты вида /+ HINT */. Но если хинт находится в комментарии, его тоже нужно удалить.

Есть наработки: \/\*(?!\+)(.|\n)*?(\*\/)$

https://regex101.com/r/8CpB0X/1

Вроде работает, но если будет текст или пробел после красных */, то он будет идти до следующей закрывающей конструкции. Как можно модифицировать данное выражение? Или может переписать его как-то?

Использоваться регулярное выражение будет на c# для обработки файла с кодом pl/sql.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.12.2019, 08:58
Ответы с готовыми решениями:

Регулярное выражение для многострочных комментариев
помогите сделать регулярку для много строчных комментариев...тобишь вида /*bla bla*/ я делаю вот...

Регулярное выражение: поиск комментариев в коде
Стоит задача вывести в консоль все комментарии с кода ( "//" и "/* */") с помощью регулярного...

Регулярное выражение: нахождение комментариев в тексте
Добрый день, Как найти в коде комментарий такого вида: /* Такой комментарий*/ /* Или такой.......

Составить регулярное выражение для комментариев в тексте
Необходимо регулярное выражение для комментариев в тексте вида /*asd*/ также /**/(пустые) и /*...

12
Эксперт .NET
14840 / 11227 / 2947
Регистрация: 17.09.2011
Сообщений: 18,808
25.12.2019, 09:11 2
Цитата Сообщение от MikeGG Посмотреть сообщение
Использоваться регулярное выражение будет на c# для обработки файла с кодом pl/sql
PL/SQL не является регулярным языком, потому использовать регулярные выражения для его парсинга — не самая лучшая затея.
Может, имеет смысл написать нормальный парсер? Или найти готовый — поисковики по запросу ".net plsql parser" выдают много интересных результатов.

Если целью является только удаление комментариев, то обычная работа со строками при первом рассмотрении кажется более простым подходом.
1
850 / 646 / 208
Регистрация: 30.04.2009
Сообщений: 2,706
25.12.2019, 13:16 3
что если в конце комментария будет текст /+ HINT?
0
Эксперт .NET
8647 / 6107 / 1019
Регистрация: 21.01.2016
Сообщений: 23,052
25.12.2019, 13:21 4
Мне тоже кажется, что простой конечный автомат перебирающий символы входной строки с текстом PL/SQL будет и проще и надёжнее, чем регулярка.
0
0 / 0 / 0
Регистрация: 28.05.2017
Сообщений: 13
25.12.2019, 13:51  [ТС] 5
Это уже будет синтаксическая ошибка.
Только так может быть
Код
/* COMMENT /*+ HINT */ */
0
850 / 646 / 208
Регистрация: 30.04.2009
Сообщений: 2,706
25.12.2019, 14:28 6
MikeGG, а это так по спецификации pl sql или вы сами придумали, что так было бы удобнее?
0
0 / 0 / 0
Регистрация: 28.05.2017
Сообщений: 13
25.12.2019, 14:31  [ТС] 7
По спецификации pl sql так
0
850 / 646 / 208
Регистрация: 30.04.2009
Сообщений: 2,706
25.12.2019, 14:38 8
Цитата Сообщение от MikeGG Посмотреть сообщение
По спецификации pl sql так
Тогда можете смело репортить баг в oracle ибо на официальном сайте это не так работает. (См. скрин)
Регулярное выражение по удалению комментариев (не задеть хинты)
0
850 / 646 / 208
Регистрация: 30.04.2009
Сообщений: 2,706
25.12.2019, 15:05 9
Лучший ответ Сообщение было отмечено MikeGG как решение

Решение

Но если хочется упороться то такой regex \/\*(?!\+)((.|\n)*?(\/\*\+.*?\*\/)?)*?\*\/ работает, хоть и не то все хинты выделяет в отдельные группы.
1
Usaga
25.12.2019, 17:30
  #10

Не по теме:

Интересно, знал ли человек выдумавший регулярки, что его творение будут упорно пытаться использовать для решения всех вопросов работы с текстом, даже там, где они вообще не в кассу?)

0
Эксперт .NET
14840 / 11227 / 2947
Регистрация: 17.09.2011
Сообщений: 18,808
25.12.2019, 18:07 11
Цитата Сообщение от nicolas2008 Посмотреть сообщение
такой regex работает
До тех пор, пока в базе не решат хранить SQL-запросы в строковом представлении:
SQL
1
INSERT INTO tutorials VALUES(1, 'Сегодня поговорим о хинтах в PL/SQL. Типичный хинт среди комментариев выглядит как-то так: /* COMMENT /*+ HINT */ */');
0
850 / 646 / 208
Регистрация: 30.04.2009
Сообщений: 2,706
25.12.2019, 18:22 12
Цитата Сообщение от kolorotur Посмотреть сообщение
До тех пор, пока в базе не решат хранить SQL-запросы в строковом представлении:
В ТЗ не было ничего сказано о том что надо пропускать комментарии в строковых константах
0
Эксперт .NET
14840 / 11227 / 2947
Регистрация: 17.09.2011
Сообщений: 18,808
25.12.2019, 19:02 13
nicolas2008, да это не в ваш огород камень, а в огород самой идеи использования регексов для парсинга не регулярных языков.
Если уж для проверки банального адреса электропочты городят километры регекса, то чего о языках программирования говорить.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.12.2019, 19:02

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Составить регулярное выражение удаления комментариев в javasctipt вставках
В своей работе, использую в самодельном движке, вывод страницы в одну строчку. Вроде как чтоб было...

регулярное выражение
Надо написать регулярное выражение является ли оно даттой начиная с 1600 до 9999... строка типа: ...

Регулярное выражение
Товарищи, подскажите регулярное выражение Perl, чтобы определенная буква или цифра встречалась в...

Регулярное выражение
Как ето сделать? Написать регулярное выражение, которое определяет является ли входная лента...


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

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

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