首页 > 解决方案 > 正则表达式从函数组中获取单个函数体

问题描述

我有一个包含一组file.js函数的 javascript 文件 []。代码看起来像这样:

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

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

我试过这个正则表达式:

@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]+?[^\\\']\} *(?!;))

因此,最好根据您的设置进行调整。总而言之,您应该选择独立式闭合支架,因为这对于大多数功能块来说应该是确定的。

标签: javascriptregex

解决方案


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

查找 a}前面没有 a \,或者在语法上没有转义

现在,正则表达式变为:

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

现场示例


可以进一步简化为:

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

现场示例


编辑:

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


推荐阅读