如何使用正则表达式查找多行JavaScript注释块?

如何使用正则表达式查找多行JavaScript注释块?,javascript,regex,Javascript,Regex,我试图从JavaScript文件中提取代码注释块。我正在制作一部轻码纪录片 例如: /** @Method: setSize * @Description: setSize DESCRIPTION * @param: setSize PARAMETER */ 我需要像这样拉出注释设置,理想情况下是将其放入数组中 我已经做到了这一点,但意识到它可能无法处理新行选项卡等: \/\*\*(.*?)\*\/ (好的,这看起来很简单,但我正在绕圈尝试让它工作。)这应该抓住一个注释块\/\*\*[

我试图从JavaScript文件中提取代码注释块。我正在制作一部轻码纪录片

例如:

/** @Method: setSize
 * @Description: setSize DESCRIPTION
 * @param: setSize PARAMETER
 */
我需要像这样拉出注释设置,理想情况下是将其放入数组中

我已经做到了这一点,但意识到它可能无法处理新行选项卡等:

\/\*\*(.*?)\*\/

(好的,这看起来很简单,但我正在绕圈尝试让它工作。)

这应该抓住一个注释块
\/\*\*[^/]+\/
。不过,我不认为Regexp是从这些块生成数组的最佳方法。这个regexp基本上说:

查找
/**
(星号和正斜杠用
\
转义)

然后查找任何不是
/

然后找到一个
/

这是粗糙的,但通常应该是有效的。下面是一个活生生的例子

魔法怎么样:)

comment.replace(/@(\w+)\s*\:\s*(\s+)\s+(\w+)/gim,函数(匹配,标记,名称,描述){
log(参数);
//做某事。。。
});

我还没有测试过这一点,因此对于正则表达式没有任何保证,只是想指出一种可能性,即使用John Resig方法进行一些正则表达式搜索8-

根据您希望继续使用提取的docblock执行的操作,会想到多种方法。如果只需要docblock而不需要进一步引用,String.match()就足够了。否则,您可能需要块的索引

正如其他人已经指出的那样,javascript的正则表达式机器功能非常强大。如果你习惯于PCRE,这感觉就像双手绑在背后工作
[\s\s]
(空格字符,非空格字符)等同于dotAll-也可以捕获换行符

这应该让你开始:

var string = 'var foo = "bar";'
    + '\n\n'
    + '/** @Method: setSize'
    + '\n * @Description: setSize DESCRIPTION'
    + '\n * @param: setSize PARAMETER'
    + '\n */'
    + '\n'
    + 'function setSize(setSize) { return true; }'
    + '\n\n'
    + '/** @Method: foo'
    + '\n * @Description: foo DESCRIPTION'
    + '\n * @param: bar PARAMETER'
    + '\n */'
    + '\n'
    + 'function foo(bar) { return true; }';

var docblock = /\/\*{2}([\s\S]+?)\*\//g,
    trim = function(string){ 
        return string.replace(/^\s+|\s+$/g, ''); 
    },
    split = function(string) {
        return string.split(/[\r\n]\s*\*\s+/);
    };

// extract all doc-blocks
console.log(string.match(docblock));

// extract all doc-blocks with access to character-index
var match;
while (match = docblock.exec(string)) {
    console.log(
        match.index + " characters from the beginning, found: ", 
        trim(match[1]), 
        split(match[1])
    );
}

我不确定regexp是否是处理多行的最佳工具,解析逻辑取决于它是否是第一行/最后一行/中间行…找到结尾的更好方法是使用非贪婪模式
*?\*\/
。第一部分(
*?
)匹配任何内容,但得到匹配的最短模式。然后,
\*\/
匹配注释的结尾。@mcrumley这稍微干净一点,尽管您需要启用dotall标志,否则
*?
与返回字符不匹配。我认为javascript不支持dotall标志。@mcrumley这个问题证实了javascript不支持dotall标志,但建议使用
[\s\s]*?
解决方法,谢谢gents的帮助!太棒了。这就是为什么我喜欢这个板。