我有一个包含一组功能的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]+?[^\\\']\} *(?!;))
因此,最好根据您的设置进行调整。全部收费,您应该使用独立式封闭支架,因为这对于大多数功能块来说都是确定的。
答案 0 :(得分:2)
您可以在正则表达式中的[^\\]
之前添加\}
,以完成任务,这表明:
找到没有
}
开头的\
或语法上没有转义的{1>
现在,正则表达式变为:
@marked[^\^]*?\*\/[^\^]*?(function[^\^]*?\{[\S\s]+?[^\\]\})
可以进一步简化为:
@marked[\s\S]*?(function[\s\S]*?[^\\]\})
编辑:
对于更通用的解决方案,您可以在[;\s]
之前使用\}
。