Regex для получения отдельных функциональных тел из группы функций - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть файл javascript [file.js], содержащий группу функций.Код выглядит примерно так:

/**
 * Description 1
 * @param arg_1 {String}
 * @marked
 * @return {String}
 */
function func_1(arg_1)
{
    var test_var = arg_1.replace(/(?=[\\^$*+?.\(\)|{\}[\]])/g, "\\");
    return test_var;
}

/**
 * Description 2
 * @param arg_1 {String}
 * @notmarked
 * @return {String}
 */
function func_2(arg_1)
{
    var test_var = arg_1.replace(/(?=[\\^$*+?.\(\)|{\}[\]])/g, "\\");
    return test_var;
}

/**
 * Description 3
 * @param arg_1 {String}
 * @marked
 * @return {String}
 */
function func_3(arg_1)
{
    var test_var = arg_1.replace(/(?=[\\^$*+?.\(\)|{\}[\]])/g, "\\");
    return test_var;
}

Обратите внимание на теги JSDoc @marked и @notmarked.

Задача, которую мне нужно выполнить, - добавить комментарии к каждой функции, которая имеет@marked tag.

Таким образом, кодовый блок, который был таким:

/**
 * Description 1
 * @param arg_1 {String}
 * @marked
 * @return {String}
 */
function func_1(arg_1)
{
    var test_var = arg_1.replace(/(?=[\\^$*+?.\(\)|{\}[\]])/g, "\\");
    return test_var;
}

Получается так:

/**
 * Description 1
 * @param arg_1 {String}
 * @marked
 * @return {String}
 */
//start
function func_1(arg_1)
{
    var test_var = arg_1.replace(/(?=[\\^$*+?.\(\)|{\}[\]])/g, "\\");
    return test_var;
}
//end

Главный камень преткновения подходит к подходящемурегулярное выражение [регулярное выражение], чтобы правильно изолировать функции, чтобы я мог сделать замену регулярного выражения.

я пробовал это регулярное выражение:

@marked[^\^]*?\*\/[^\^]*?(function[^\^]*?\{[\S\s]+?\})

, который получает совпадения двух функций, но этоостановка закрытия полного тела функции, потому что в самом теле есть закрывающая скобка (}).И изменение [\S\s]+? на [\S\s]+ просто вытягивает все до последней скобки последней функции.

Исправлено ли это регулярное выражение или есть лучший способ выполнить задачу?

РЕДАКТИРОВАТЬ

Ответ @ rv7 решил проблему.Однако, в зависимости от того, как настроена ваша функция, вы можете столкнуться с другими проблемами.

Например, если у вас есть функциональный блок, подобный этому:

/**
 * Description 1
 * @param arg_1 {String}
 * @marked
 * @return {String}
 */
function func_1(arg_1)
{
    var test_var = arg_1.replace(/(?=[\\^$*+?.\(\)|{\}[\]])/g, "\\");
    var close_b = '}';
    var sub_func = function(){

    };
    return test_var;
}

Регулярное выражение в ответе будетне работа.Тем не менее, следующее регулярное выражение будет:

@marked[^\^]*?\*\/[^\^]*?(function[^\^]*?\{[\S\s]+?[^\\\']\} *(?!;))

Итак, лучше настроить в зависимости от ваших настроек.В общем, вы должны стрелять за отдельно стоящую закрывающую скобку, потому что это должно быть решающим для большинства функциональных блоков.

1 Ответ

0 голосов
/ 10 декабря 2018

Вы можете добавить [^\\] непосредственно перед \} в своем регулярном выражении, чтобы выполнить вашу задачу, которая гласит:

Найдите }, которому не предшествует \, илисинтаксически, который не экранирован

Теперь регулярное выражение становится:

@marked[^\^]*?\*\/[^\^]*?(function[^\^]*?\{[\S\s]+?[^\\]\})

Живой пример

Это может быть еще более упрощено как:

@marked[\s\S]*?(function[\s\S]*?[^\\]\})

Живой пример

РЕДАКТИРОВАТЬ:

Для более общего решения, вы можете использовать [;\s] непосредственно перед \}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...