RegEx для соответствия / замены комментариев JavaScript (как многострочных, так и встроенных) - PullRequest
37 голосов
/ 13 мая 2011

Мне нужно удалить все комментарии JavaScript из источника JavaScript с помощью объекта JavaScript RegExp.

Мне нужен шаблон для RegExp.

Пока я нашел это:

compressed = compressed.replace(/\/\*.+?\*\/|\/\/.*(?=[\n\r])/g, '');

Этот шаблон работает нормально для:

/* I'm a comment */

или для:

/*
 * I'm a comment aswell
*/

Но, похоже, не работает для встроенного:

// I'm an inline comment

Я не совсем эксперт по RegEx и его шаблонам, поэтому мне нужна помощь.

Кроме того, я хотел бы иметь шаблон RegEx, который удалял бы все эти HTML-подобныекомментарии.

<!-- HTML Comment //--> or <!-- HTML Comment -->

А также те условные комментарии HTML, которые можно найти в различных источниках JavaScript.

Спасибо.

Ответы [ 12 ]

0 голосов
/ 21 марта 2018

Интересно, это был вопрос с подвохом? профессор для студентов. Зачем? Потому что кажется для меня это НЕВОЗМОЖНО сделать это, с Регулярные выражения в общем случае.

Ваш (или чей это код) может содержать допустимый JavaScript, как это:

let a = "hello /* ";
let b = 123;
let c = "world */ ";

Теперь, если у вас есть регулярное выражение, которое удаляет все между парой / * и * /, это нарушит код выше, это удалит исполняемый код в посередине.

Если вы попытаетесь разработать регулярное выражение, которое не удалите комментарии, которые содержат кавычки тогда Вы не можете удалить такие комментарии. Это относится в одинарные, двойные и обратные кавычки.

Вы не можете удалить (все) комментарии с помощью обычного Выражения в JavaScript, как мне кажется, Может быть, кто-то может указать способ, как это сделать это для случая выше.

Что вы можете сделать, это создать небольшой парсер, который проходит через код символ за символом и знает, когда он находится внутри строки и когда это внутри комментария, и когда это внутри комментарий внутри строки и так далее.

Я уверен, что есть хороший JavaScript с открытым исходным кодом парсеры, которые могут это сделать. Может быть, некоторые из упаковочные и минимизирующие инструменты могут сделать это для Вы также.

0 голосов
/ 30 апреля 2013

Основываясь на вышеуказанных попытках и использовании UltraEdit, главным образом Абхишека Саймона, я обнаружил, что это работает для встроенных комментариев и обрабатывает все символы в комментарии.

(\s\/\/|$\/\/)[\w\s\W\S.]*

Это соответствует комментариям в началестрока или с пробелом перед //

// public static final String LETTERS_WORK_FOLDER = "/ Letters / Generated / Work";

, но не

"http://schemas.us.com.au/hub/'>" +

, поэтому не годится что-то вроде

if (x) {f (x)} // где fэто какая-то функция

она просто должна быть

if (x) {f (x)} // где f - функция

...