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, но сейчас я отлично работаю. Я автор.