Как доработать регулярное выражение?

171
02 апреля 2021, 08:20

нуждаюсь в небольшой помощи с регулярками. У меня есть регулярное выражение, которое осталось доделать, а сам не справлюсь. Регулярка должна "отмечать" все комментарии, кроме тех, что являются строками. Проблемы следующие:

1.//-Комменты не удаляются, хотя по ссылке https://regex101.com/r/6ZpIiv/1 видно что регулярка работает

2.Если удаляет, то удаляет везде. Можно ли как-то исключить удаления из строк (СТРОКА 10 НА ПЕРВОМ ФОТО)?

3.Так же нужно учесть одинарные кавычки и не удалять их содержимое, по типу '//hello'

Вот код: JS:

//Главная функция 
function commentsStrip(object){
    //проверка на поддержку браузером FILE API
    if (window.File && window.FileReader && window.Blob) {
        var content = ''; //переменная для записи содержимого файла
        var file = object.files[0]; // первый элемент массива файлов
        var reader = new FileReader();
        //при успешном прогружении файла записать содержимое в переменную
        reader.onload = function(){
            content = reader.result;
            //удалить комментарии
            let a = content.replace(/(?:(?:\/\*[\W\w]*?\*\/\n?)|(?:\/\/.*(?=\n)))/gm, '');
            //Вернуть функцию для скачивания готового документа
            return(download(a, file.name, file.type));
        }
        //считать как простой текст
        reader.readAsText(file);
    }else{
        alert("Нужные File API не поддерживаются вашим браузером!");
    }
}

Результат работы можно видеть на фото:

Answer 1

Покопавшись на форумах нашел, все-таки, нужную регулярку

var RE_BLOCKS = new RegExp([
      /\/(\*)[^*]*\*+(?:[^*\/][^*]*\*+)*\//.source,           // $1: многострочный коммент
      /\/(\/)[^\n]*$/.source,                                 // $2 однострочный коммент
      /"(?:[^"\\]*|\\[\S\s])*"|'(?:[^'\\]*|\\[\S\s])*'|`(?:[^`\\]*|\\[\S\s])*`/.source,
      /(?:[$\w\)\]]|\+\+|--)\s*\/(?![*\/])/.source,           // - оператор деления
      /\/(?=[^*\/])[^[/\\]*(?:(?:\[(?:\\.|[^\]\\]*)*\]|\\.)[^[/\\]*)*?\/[gim]*/.source
      ].join('|'),                                            // - РЕГУЛЯРКА
      'gm'  
    );
READ ALSO
megatimer настройка таймера в коде

megatimer настройка таймера в коде

Есть сайт https://megatimerru/ на котором я настраиваю дату окончания таймера и сам таймер, и есть файл megatimer

154
float гораздо быстрее, чем double [закрыт]

float гораздо быстрее, чем double [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

167
Остановить перехват out и err

Остановить перехват out и err

Начинаю перехват потоков out и err в файл, но как остановить перехват после выполнения определенной команды?

174
Как уменьшить ошибку интерполяции на границах интервала

Как уменьшить ошибку интерполяции на границах интервала

Необходимо выполнить интерполяцию данных кубическим сплайномВсе вроде хорошо, но полиномы на концах имеют уж слишком большую ошибку

207