Как удалить комментарии в стиле C из кода
Я только что прочитал новый вопрос здесь о SO, задавая в основном то же самое, что и мой в названии. Это заставило меня задуматься - и искать в Интернете (большинство хитов указывало на SO, конечно;). Так что я подумал -
Должно быть простое регулярное выражение, способное удалять комментарии в стиле C из любого кода.
Да, есть ответы на этот вопрос / утверждение о SO, но те, которые я нашел, все неполные и / или слишком сложные.
Поэтому я начал экспериментировать и придумал тот, который работает со всеми типами кода.I может себе представить:
(?:\/\/(?:\\\n|[^\n])*\n)|(?:\/\*(?:\n|\r|.)*?\*\/)|(("|')(?:\\\\|\\\2|\\\n|[^\2])*?\2)
Первые альтернативные проверки длядвойная косая черта //
Комментарии. Второй дляобычный те,/* comment */
, В-третьих, у меня возникли проблемы с поиском других регулярных выражений, имеющих дело с той же обработкой задач -строки, содержащие последовательности символов, которые вне строки, будут считаться комментариями.
Эта часть выполняет захват всех строк в первой группе захвата, сопоставляя знак кавычки во второй группе захвата с кавычками до конца строки.
Первая группа должна быть заменена, все выброшено (заменено на""
) оставляя без комментариев код :).
ОК ... Так что это не вопрос. Это ответ, который вы думаете ...
Да, ты прав. Итак ... к вопросу.
Я пропустил какой-либо код, который пропустит это регулярное выражение?
Это обрабатывает
многострочные комментарии
/*
an easy one
*/
комментарии в конце строки
// Remove this
комментарии в строках
char array[] = "Following isn't a comment // because it's in a string /* this neither */";
который приводит к - строки с экранированными кавычками
char array[] = "Handle /* comments */ - // - in strings with \" escaped quotes";
и струны с побегами
char array[] = "Handle strings with **not** escaped quotes\\"; // <-EOS
строка в одинарных кавычках
var myStr = 'Should also ignore enclosed // comments /* like these */ ';
продолжение строки
// This is a single line comment \
continuing on the next row (warns, but works in my C++ flavor)
Так,Можете ли вы вспомнить какие-либо случаи кода, которые портят это? Если вы придумали что-нибудь, я постараюсь завершить RE, и, надеюсь, это закончитсяполный ;)
С уважением.
PS. Я знаю ... Запись этого написана на правой панели подКак спросить: Мы предпочитаем вопросы, на которые можно ответить, а не просто обсудить. Этот вопрос может нарушать это: S, но я не могу устоять.
Фактически, это может даже оказаться ответом, а не вопросом, для некоторых людей. (Слишком дерзкий?;)