如何使用JavaScript正则表达式捕获CSS多行注释块

3

我正在尝试使用JavaScript正则表达式来捕获CSS多行注释块,但是我不确定如何找到闭合注释标记,而避免在HTML示例中得到偶尔出现的斜杠,以下是一个具体案例:

/*@comment

    @title: Buttons
    @name: block-name
    @category: Category name > Sub category
    @description: This is the description of the element
    @html:
        <div class="block-name"></div>

*/

我正在尝试使用这个正则表达式,但是我只能匹配到闭合的div标签:

\/\*@comment([^\*\/]){1,}

所以我尝试添加结束注释标记,但它停止工作了:

\/\*@comment([^\*\/]){1,}\*\/

如何找到一个JavaScript正则表达式来捕获整个块?

请注意,我可以在每个文件中找到多个这样的块,因此我将在正则表达式上使用g标记。


2
\/\*[\s\S]*?\*\/ - Wiktor Stribiżew
@MaxMastalerz 'a/*b*/c/*d*/'.match(/\/\*([^;]*)\*\//g) 的输出结果是 ["/*b*/c/*d*/"] 而不是 ["/*b*/", "/*d*/"] - Oriol
1个回答

4
请注意,([^\*\/]){1,}只匹配除了*/之外的一个或多个单独字符,而不是两个字符的序列。
您可以使用惰性匹配(*?量词尽可能匹配尽少的字符以确保找到匹配)与[^][\s\S](匹配包括换行符在内的任何字符的类):
/\/\*@comment[\s\S]*?\*\//g

查看 正则表达式演示

var re = /\/\*@comment[\s\S]*?\*\//g; 
var str = '/*@comment\n\n    @title: Buttons\n    @name: block-name\n    @category: Category name > Sub category\n    @description: This is the description of the element\n    @html:\n        <div class="block-name"></div>\n\n*/';
var m;
 
while ((m = re.exec(str)) !== null) {
    if (m.index === re.lastIndex) {
        re.lastIndex++;
    }
    console.log(m[0]);
}

我更喜欢使用[\s\S]而不是[^],因为后者只被JavaScript正则表达式引擎支持。


你也可以使用\/\*@comment(?:(?!\*\/)[\s\S])*\*\/正则表达式版本,其中包含一个温和的贪婪标记,但我怀疑在这里使用它没有任何理由,因为匹配中没有其他你“禁止”的单词。 - Wiktor Stribiżew

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