Javascript comment stripper
Я ищу инструмент для удаления комов из источников Javascript. Я смог использовать Google, но никто из них не выполнил следующее требование: Все остальное должно быть оставлено как есть, в частности, пробел не удаляется, НО если комментарий занимает целую строку, строка также удаляется.
Вкратце, я хочу иметь возможность перейти из хорошо отформатированного источника с комментариями к одинаково отформатированному источнику без комментариев. Строки, содержащие только комментарии, удаляются, а трелирующие комментарии удаляются вместе с конечными пробелами. Остальное осталось так, как есть.
Знаете ли вы какой-либо инструмент для такой работы?
EDIT: Я стараюсь быть более конкретным. Использование регулярных выражений невозможно, так как символы //
или /*
также могут отображаться внутри строк, регулярных выражений и т.д.
Инструмент должен принимать этот вход
var a = true;
//the following code is every useful
var b = 2;//really, really useful
/**
Never, ever do this
var c = 3;
*/
var d = 4;
и выдаем этот результат
var a = true;
var b = 2;
var d = 4;
Ответы
Ответ 1
Вот код, который я взбивал:
Проверьте это: здесь
Также здесь является примером моего кода, который вы можете проверить прямо сейчас на веб-странице
Здесь я не писал, что это может быть удобно, хотя его код не будет работать в некоторых литералах регулярных выражений: http://james.padolsey.com/javascript/removing-comments-in-javascript/ p >
EDIT:
Код, который я написал, как есть. Я не обновляю его. Если есть ошибка, вы можете исправить ее.
Ответ 2
Используйте Google Closure Compiler с WHITE_SPACE_ONLY и PRETTY_PRINT - единственное, что он сделает, это удалить комментарии (если, конечно, t форматируйте свой код так, как это делает PRETTY_PRINT.)
Он превращает это:
// This function alerts a name
function hello(name) {
/**
* One lone
* multi-line
* comment
*/
alert('Hello, ' + name);
}
hello('New user');
В это:
function hello(name) {
alert("Hello, " + name)
}
hello("New user");
Ответ 3
Нашел здесь довольно приятное решение: http://blog.ostermiller.org/find-comment
Выдержки:
Теперь нам просто нужно изменить конец комментария, чтобы разрешить любое число *:
/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/
Теперь у нас есть регулярное выражение, которое можно вставить в текстовые редакторы, поддерживающие регулярные выражения. Поиск наших комментариев - это вопрос нажатия кнопки поиска. Возможно, вы сможете упростить это выражение для своего конкретного редактора. Например, в некоторых реализациях регулярных выражений [^] предполагает [\ r\n], и все [\ r\n] могут быть удалены из выражения.
Это легко увеличить, чтобы он также нашел комментарии к стилю:
(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*)
Обязательно прочитайте оговорки, однако, поскольку это удалит комментарии с комментариями или может безоговорочно прокомментировать комментарий. Однако я отлично работал у меня: -)
Ответ 4
Библиотека decomment делает именно то, что вы описали:
Все остальное должно быть оставлено как есть, в частности, пробел не удаляется, НО если комментарий берет целую строку, линия также удаляется.
И он также поддерживает JSON5, JavaScript ES6, CSS и HTML.
Ответ 5
Просто небольшое понимание, которое может помочь вам сделать сложное регулярное выражение намного проще..
не стесняйтесь позже применять любые советы в ответах выше..
var text = ".................."; //assuming staring point
........
text = text
.replace(/\r/g,"##R##")
.replace(/\n/g,"##N##")
.replace(/\/\*(.*)\*\//g,"")
.replace(/##R##/g,"\r")
.replace(/##N##/g,"\n")
применяя небольшую (независимую) замену \r
и \n
, упростит ваше регулярное выражение A LOT!,
первоначально даже с модификаторами g
и m
(глобальными и "жадными" флагами), вам все равно не удастся удалить комментарии (если вы не настроили собственный цикл "символьный ходок" или не reg-ex несколько раз...) это связано с некоторыми характеристиками соответствия регулярного выражения, оставленного в limbo, поскольку ECMAScript 4 (ECMA-262)
<суб > Что здесь стоит сделать, что стоит упомянуть?
Таким образом, мы применяем замечательный маленький трюк, известный в Дискретной математике (языки и грамматика) как "замена вне нашей грамматики", я использую это в обычном порядке для "защиты" областей \r
и \n
в текст, фактически не применяя слишком много вычислительной мощности для их обработки (как в cut/assembly и т.д.)
Здесь это своего рода игра, поскольку, по существу, ##R##
и ##N##
(хотя и не так часто), может быть существующей фразой, но это не проблема, поскольку замена может быть бесконечно малой - более сложной.
Короче говоря,
Регулярные выражения будут проще,
Регулярные замены будут работать так, как предполагалось, без этой пробельной ошибки.
И \n
и \r
будут восстановлены до их первоначального размещения, неповрежденными.
суб >
Ответ 6
наивный один съемщик лайнера:
var noComments = text.replace(/\/\*(.|[\r\n])*?\*\//g, '').replace(/\/\/.*/gm, '');
ОТКАЗ:
"наивный" означает:
-
он перебирает всюду, скажем, если у вас есть:
var a = "/*";
someImportantLogicHere();
var b = "*/";
то вы получите
var a = "";
-
в котором вы применяете эти значения регулярных выражений, вы получите разные результаты, применяя его в другом порядке
но для 95% других случаев это простой и парактический
Ответ 7
См. jspreproc
Это препроцессор исходного файла и средство для удаления комментариев для JavaScript, написанное в javascript с использованием регулярных выражений. В источниках вы можете увидеть пример поиска регулярных выражений (почти безопасно).
Поддержка jspreproc...
- условные комментарии в стиле C и определяет (# if-else-endif, #define, #undef и т.д.)
- Вставка файла с операторами #include и #include_once
- Комментарии удаляются, все или выборочно, используя фильтры, чтобы хранить комментарии и директивы JSDoc для разных линтеров.
- Конфигурируемое уплотнение и нормализация пустой строки
- Интерфейсы командной строки и node.js
Это WIP, но сейчас я отлично работаю. Я автор.