Регулярное выражение JS заменяет, но пропускает

#javascript #regex

#javascript #регулярное выражение

Вопрос:

Можете ли вы помочь мне с некоторыми регулярными выражениями. Редактор Razor и я хочу, когда просматриваю содержимое и нахожу } , чтобы установить новый порядок, но пропускаю, когда я }} .

Например:

HTML-файл

 <tittle> {{ title }} </title>        <-- it remains so
<script>
    function name () {
      some code...
    }                                <-- go to new line
  

Мой код таков:

     var readableHTML = text.trim();
    var lb = 'rn';
    var tab = "u0020u0020u0020u0020";

    //Check for brackets
    readableHTML = readableHTML.replace(new RegExp(" {", 'gi'), lb   tab   "{");
    readableHTML = readableHTML.replace(new RegExp("({{([^{}]*)}})([^}])", 'gi'), lb   tab   "}"); <-- This is my wrong regex
  

Комментарии:

1. Какова ваша цель: вы хотите улучшить код JavaScript?

2. что-то вроде этого да. но мне нужно только для этой части. Tnks

3. Почему вы используете группировку или нечувствительность к регистру?

4. Я новичок в этом деле. Я несколько раз пытаюсь сделать это правильно. Я использую этот сайт для этого: regex101.com/r/o9Pt7s/1

5. Поймите, что function f() {{ return 1; }} это допустимый JavaScript. Что вы хотите, чтобы с этим произошло?

Ответ №1:

Кажется, вы хотите добавлять новые строки только перед закрытием фигурных скобок, когда это касается JavaScript. Поэтому я бы посоветовал вам ограничить область замены script тегами. Для этого вы могли бы использовать анализатор DOM, который поможет идентифицировать эти script элементы и позволит вам изменять их содержимое.

 function replaceInScripts(html, find, replace) {
    var doc = new DOMParser().parseFromString(html,"text/html");
    Array.from(doc.querySelectorAll('script'), function(script) {
        script.textContent = script.textContent.replace(find, replace);
    });
    return doc.documentElement.outerHTML;
}

// Sample data:
var html = `<html>
  <head>
    <title> {{ title }} </title>
  </head>
  <body>
    <script>
        function name () { return 1; }
    </script>
  </body>
</html>`;

// Call the function for replacing text within script elements only:
html = replaceInScripts(html, /(S)s*}/g, '$1n    }'); 

// Output updated HTML:
console.log(html);  

Ответ №2:

Почему бы и нет?

 readableHTML = readableHTML.replace(new RegExp(" {", 'gi'), lb   tab   "{");
readableHTML = readableHTML.replace(new RegExp(" {{2}", 'gi'), lb   tab   "{{");
readableHTML = readableHTML.replace(new RegExp(" }", 'gi'), lb   tab   "}");
readableHTML = readableHTML.replace(new RegExp(" }{2}}", 'gi'), lb   tab   "}}");