正则表达式从功能组中获取单个功能主体

时间:2018-12-10 17:35:40

标签: javascript regex

我有一个包含一组功能的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标签的函数添加注释。

所以这是一个代码块:

/**
 * 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

主要的绊脚石是提出一个合适的regex [正则表达式]以正确隔离功能,以便我可以进行regex替换。

我尝试过此正则表达式:

@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 :(得分:2)

您可以在正则表达式中的[^\\]之前添加\},以完成任务,这表明:

  

找到没有}开头的\或语法上没有转义的{

现在,正则表达式变为:

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

Live Example


可以进一步简化为:

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

Live Example


编辑:

对于更通用的解决方案,您可以在[;\s]之前使用\}