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

4

我试图从JavaScript文件中提取代码注释块,以制作一个轻量级的代码文档生成器。

例如:

/** @Method: setSize
 * @Description: setSize DESCRIPTION
 * @param: setSize PARAMETER
 */

我需要将像这样设置的注释提取出来,最好是放到一个数组中。

我已经做到了这一步,但意识到它可能无法处理换行符、制表符等:

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

好的,这看起来似乎很简单,但我在试图让它工作时一直转圈。


2
我不确定正则表达式是处理这个问题的最佳工具,因为你正在处理多行文本,而解析逻辑取决于它是第一行、最后一行还是中间行... - Oleg Mikheev
3个回答

5

根据您想要继续处理提取出的文档块的需求,有多种方法可供选择。如果您只需要文档块而不需要进一步的引用,则可以使用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])
    );
}

感谢各位的帮助!太棒了。这就是我喜欢这个论坛的原因。 - ted.goodridge

1

这应该可以抓取一个注释块 \/\*\*[^/]+\/。但我认为正则表达式不是从这些块中生成数组的最佳方式。这个正则表达式基本上是说:

找到一个/**(星号和斜杠用\转义)

然后找到任何不是/的东西

然后找到一个/

它很粗糙,但通常应该有效。这里有一个实时示例 http://regexr.com?300c6


一种更好的方法是使用非贪婪模式 .*?\*\/ 来找到结尾。第一部分 (.*?) 匹配任何内容,但获取最短匹配的模式。然后 \*\/ 匹配注释的结尾。 - mcrumley
@mcrumley 这样写更简洁,但是你需要启用dotall标志,否则 .*? 将无法匹配换行符。我不认为JavaScript支持dotall标志。 - punkrockbuddyholly
@mcrumley 这个问题确认了 JavaScript 不支持 dotall 标志,但建议使用 [\s\S]*? 来解决。https://dev59.com/4XNA5IYBdhLWcg3wKacx - punkrockbuddyholly

0

有没有一些魔法呢 :)

comment.replace(/@(\w+)\s*\:\s*(\S+)\s+(\w+)/gim, function (match, tag, name, descr) {
    console.log(arguments);
    // Do sth. ...
});

我没有测试过这个正则表达式,所以不能保证它的准确性,只是想给你指出一种可能性,可以像John Resig那样进行一些RegExp搜索 8-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接