Javascript 正则表达式捕获*后跟*时不起作用的代码注释/

Javascript 正则表达式捕获*后跟*时不起作用的代码注释/,javascript,regex,Javascript,Regex,我制作了一个正则表达式来捕获代码注释,除了注释包含*[中间任意数量的字符]/的情况外,这些注释似乎正常工作,例如: /*以下是一些注释 =412414515/*somecharacters/][;';']*/ 正则表达式:(\/\*[^*]*[^/]*\*\/) 只需使用惰性运算符,而不是尝试不匹配* 只需使用惰性运算符,而不是尝试不匹配*作为开始,我建议使用以下模式: (\/\*[\S\s]*?\*\/) const regex=/(\/\*[\S\S]*?\*\/)/g; const

我制作了一个正则表达式来捕获代码注释,除了注释包含
*[中间任意数量的字符]/
的情况外,这些注释似乎正常工作,例如:

/*以下是一些注释
=412414515/*somecharacters/][;';']*/

正则表达式:
(\/\*[^*]*[^/]*\*\/)

只需使用惰性运算符,而不是尝试不匹配*


只需使用惰性运算符,而不是尝试不匹配*

作为开始,我建议使用以下模式:

(\/\*[\S\s]*?\*\/)

const regex=/(\/\*[\S\S]*?\*\/)/g;
const str=`This is/some code/*这是一些注释
=412414515/*somechars/]*/*/
还有代码吗
/*还有一些不可读的评论a[dpas[;[];135//]
d0gewt0qkgekg;l“\\////
*/天哪,我讨厌regex/*asda*asd
\\asd*sd*/`;
让m;
while((m=regex.exec(str))!==null){
//这是避免具有零宽度匹配的无限循环所必需的
if(m.index==regex.lastIndex){
regex.lastIndex++;
}
//可以通过'm`-变量访问结果。
m、 forEach((匹配,组索引)=>{
log(`Found match,group${groupIndex}:${match}`);
});

}
首先,我建议采用以下模式:

(\/\*[\S\s]*?\*\/)

const regex=/(\/\*[\S\S]*?\*\/)/g;
const str=`This is/some code/*这是一些注释
=412414515/*somechars/]*/*/
还有代码吗
/*还有一些不可读的评论a[dpas[;[];135//]
d0gewt0qkgekg;l“\\////
*/天哪,我讨厌regex/*asda*asd
\\asd*sd*/`;
让m;
while((m=regex.exec(str))!==null){
//这是避免具有零宽度匹配的无限循环所必需的
if(m.index==regex.lastIndex){
regex.lastIndex++;
}
//可以通过'm`-变量访问结果。
m、 forEach((匹配,组索引)=>{
log(`Found match,group${groupIndex}:${match}`);
});

}
有趣的是,几乎同时使用相同的解决方案。:)OP是正确的,一般来说,否定字符类优于在量词上使用惰性修饰符,因为这会阻止回溯(如果文件足够大且匹配将超时,则可能导致灾难性的回溯)。但是,注释中的*文本被认为是有效的,因此不能使用否定类[^*]来匹配注释的内容。有趣的是,几乎同时使用相同的解决方案。:)OP是正确的,一般来说,否定字符类优于在量词上使用惰性修饰符,因为这会阻止回溯(如果文件足够大且匹配将超时,则可能导致灾难性的回溯)。但是,*文本在注释中被认为是有效的,因此不能使用否定类[^*]来匹配注释的细节。我想指出的一点是第二行:多行注释由第一行*终止,第二行不是注释的一部分-就像在普通的c风格解析器中一样。解决方案很有效,但我有个问题,因为我还是不太明白<代码>[\S\S]*匹配任何非空白字符和任何空白字符零次或多次。这和
*
不一样吗?
与新行不匹配我想指出的一点是第二行:多行注释由第一行终止*第二行不是注释的一部分-就像在普通的c风格解析器中一样。解决方案是可行的,但我有一个问题,因为我仍然没有真正理解它<代码>[\S\S]*匹配任何非空白字符和任何空白字符零次或多次。这与
*
不一样吗?
与换行符不匹配