正则expression式匹配/replaceJavaScript注释(多行和内联)

我需要使用JavaScript RegExp对象从JavaScript源代码删除所有JavaScript注释。

我需要的是RegExp的模式。

到目前为止,我已经find了这个:

compressed = compressed.replace(/\/\*.+?\*\/|\/\/.*(?=[\n\r])/g, ''); 

这种模式适用于:

 /* I'm a comment */ 

或为:

 /* * I'm a comment aswell */ 

但似乎并不适用于内联:

 // I'm an inline comment 

我不是RegEx的专家,也不是模式,所以我需要帮助。

此外,我想有一个RegEx模式女巫将删除所有这些类似HTML的评论。

 <!-- HTML Comment //--> or <!-- HTML Comment --> 

而且这些有条件的HTML评论巫婆可以在各种JavaScript源中find。

谢谢

尝试这个,

 (\/\*[\w\'\s\r\n\*]*\*\/)|(\/\/[\w\s\']*)|(\<![\-\-\s\w\>\/]*\>) 

应该工作:) 在这里输入图像描述

注:正则expression式不是一个词法分析器或parsing器 。 如果你有一些奇怪的边缘情况,你需要从一个string中parsing出一些奇怪的嵌套注释,那就使用parsing器。 对于另外98%的这个正则expression式应该工作。

我有非常复杂的块注释进行嵌套星号,斜线等在下面的网站的正则expression式就像一个魅力:

http://upshots.org/javascript/javascript-regexp-to-remove-comments
(见下面原件)

已经做了一些修改,但原始正则expression式的完整性已被保留。 为了允许某些双斜杠( // )序列(例如URL), 您必须在replace值中使用反向引用$1而不是空string 。 这里是:

 /\/\*[\s\S]*?\*\/|([^\\:]|^)\/\/.*$/gm // JavaScript: // source_string.replace(/\/\*[\s\S]*?\*\/|([^\\:]|^)\/\/.*$/gm, '$1'); // PHP: // preg_replace("/\/\*[\s\S]*?\*\/|([^\\:]|^)\/\/.*$/m", "$1", $source_string); 

演示: http : //www.regextester.com/? fam= 96247

失败的使用案例:这个正则expression式失败了。 在这个公开的主要文件中logging了这些案件的一个持续清单。 如果您能find其他案例,请更新要点。

…如果你想删除<!-- html comments -->使用这个:

 /\/\*[\s\S]*?\*\/|([^\\:]|^)\/\/.*|<!--[\s\S]*?-->$/ 

(原始 – 仅供历史参考)

 /(\/\*([\s\S]*?)\*\/)|(\/\/(.*)$)/gm 

我一直在创造一个expression,需要做类似的事情。
成品是:

 /(?:((["'])(?:(?:\\\\)|\\\2|(?!\\\2)\\|(?!\2).|[\n\r])*\2)|(\/\*(?:(?!\*\/).|[\n\r])*\*\/)|(\/\/[^\n\r]*(?:[\n\r]+|$))|((?:=|:)\s*(?:\/(?:(?:(?!\\*\/).)|\\\\|\\\/|[^\\]\[(?:\\\\|\\\]|[^]])+\])+\/))|((?:\/(?:(?:(?!\\*\/).)|\\\\|\\\/|[^\\]\[(?:\\\\|\\\]|[^]])+\])+\/)[gimy]?\.(?:exec|test|match|search|replace|split)\()|(\.(?:exec|test|match|search|replace|split)\((?:\/(?:(?:(?!\\*\/).)|\\\\|\\\/|[^\\]\[(?:\\\\|\\\]|[^]])+\])+\/))|(<!--(?:(?!-->).)*-->))/g 

可怕的吧?

要分解它,第一部分匹配单引号或双引号内的任何内容
这是避免匹配引用string所必需的

 ((["'])(?:(?:\\\\)|\\\2|(?!\\\2)\\|(?!\2).|[\n\r])*\2) 

第二部分匹配多行注释,由/ * * /

 (\/\*(?:(?!\*\/).|[\n\r])*\*\/) 

第三部分匹配行中任意位置的单行注释

 (\/\/[^\n\r]*(?:[\n\r]+|$)) 

第四到第六部分匹配正则expression式中的任何内容
这依赖于前面的等号或正则expression式调用之前或之后的文字

 ((?:=|:)\s*(?:\/(?:(?:(?!\\*\/).)|\\\\|\\\/|[^\\]\[(?:\\\\|\\\]|[^]])+\])+\/)) ((?:\/(?:(?:(?!\\*\/).)|\\\\|\\\/|[^\\]\[(?:\\\\|\\\]|[^]])+\])+\/)[gimy]?\.(?:exec|test|match|search|replace|split)\() (\.(?:exec|test|match|search|replace|split)\((?:\/(?:(?:(?!\\*\/).)|\\\\|\\\/|[^\\]\[(?:\\\\|\\\]|[^]])+\])+\/)) 

和我原来忘记的第七个删除html的评论

 (<!--(?:(?!-->).)*-->) 

我有一个问题,我的开发环境发出错误的正则expression式打破了一条线,所以我使用了下面的解决scheme

 var ADW_GLOBALS = new Object ADW_GLOBALS = { quotations : /((["'])(?:(?:\\\\)|\\\2|(?!\\\2)\\|(?!\2).|[\n\r])*\2)/, multiline_comment : /(\/\*(?:(?!\*\/).|[\n\r])*\*\/)/, single_line_comment : /(\/\/[^\n\r]*[\n\r]+)/, regex_literal : /(?:\/(?:(?:(?!\\*\/).)|\\\\|\\\/|[^\\]\[(?:\\\\|\\\]|[^]])+\])+\/)/, html_comments : /(<!--(?:(?!-->).)*-->)/, regex_of_doom : '' } ADW_GLOBALS.regex_of_doom = new RegExp( '(?:' + ADW_GLOBALS.quotations.source + '|' + ADW_GLOBALS.multiline_comment.source + '|' + ADW_GLOBALS.single_line_comment.source + '|' + '((?:=|:)\\s*' + ADW_GLOBALS.regex_literal.source + ')|(' + ADW_GLOBALS.regex_literal.source + '[gimy]?\\.(?:exec|test|match|search|replace|split)\\(' + ')|(' + '\\.(?:exec|test|match|search|replace|split)\\(' + ADW_GLOBALS.regex_literal.source + ')|' + ADW_GLOBALS.html_comments.source + ')' , 'g' ); changed_text = code_to_test.replace(ADW_GLOBALS.regex_of_doom, function(match, $1, $2, $3, $4, $5, $6, $7, $8, offset, original){ if (typeof $1 != 'undefined') return $1; if (typeof $5 != 'undefined') return $5; if (typeof $6 != 'undefined') return $6; if (typeof $7 != 'undefined') return $7; return ''; } 

这将返回由带引号的string文本捕获的任何内容,以及在正则expression式中find的任何内容,但会为所有注释捕获返回一个空string。

我知道这是过度的,而且很难维持,但它似乎对我来说迄今为止。

对于原来的问题来说,这已经很晚了,但也许会帮助别人。

基于@Ryan Wheale的回答,我发现这是一个全面的捕捉,以确保匹配排除在string文字中find的任何东西。

 /(?:\r\n|\n|^)(?:[^'"])*?(?:'(?:[^\r\n\\']|\\'|[\\]{2})*'|"(?:[^\r\n\\"]|\\"|[\\]{2})*")*?(?:[^'"])*?(\/\*(?:[\s\S]*?)\*\/|\/\/.*)/g 

最后一组(所有其他组都被丢弃)是基于Ryan的答案。 这里的例子。

这假定代码是结构良好,有效的JavaScript。

注意:这还没有在糟糕的结构化代码上进行testing,这些代码可能会或可能不会被恢复,这取决于javascript引擎自己的启发式。

注意:这应该适用于有效的JavaScript <ES6,但是,ES6允许多行string文字 ,在这种情况下,这个正则expression式几乎肯定会中断,尽pipe这种情况还没有经过testing。


但是,仍然可以在正则expression式中匹配类似注释的内容(请参见上面的示例中的注释/结果)。

我使用上面的捕获,使用从es5-lexer中提取的以下全面的捕获来replace所有的正则expression式文本, 这里和这里是Mike Samuel对这个问题的回答:

 /(?:(?:break|case|continue|delete|do|else|finally|in|instanceof|return|throw|try|typeof|void|[+]|-|[.]|[/]|,|[*])|[!%&(:;<=>?[^{|}~])?(\/(?![*/])(?:[^\\\[/\r\n\u2028\u2029]|\[(?:[^\]\\\r\n\u2028\u2029]|\\(?:[^\r\n\u2028\u2029ux]|u[0-9A-Fa-f]{4}|x[0-9A-Fa-f]{2}))+\]|\\(?:[^\r\n\u2028\u2029ux]|u[0-9A-Fa-f]{4}|x[0-9A-Fa-f]{2}))*\/[gim]*)/g 

为了完整性,也请参阅这个微不足道的警告 。

这几乎适用于所有情况:

 var RE_BLOCKS = new RegExp([ /\/(\*)[^*]*\*+(?:[^*\/][^*]*\*+)*\//.source, // $1: multi-line comment /\/(\/)[^\n]*$/.source, // $2 single-line comment /"(?:[^"\\]*|\\[\S\s])*"|'(?:[^'\\]*|\\[\S\s])*'/.source, // - string, don't care about embedded eols /(?:[$\w\)\]]|\+\+|--)\s*\/(?![*\/])/.source, // - division operator /\/(?=[^*\/])[^[/\\]*(?:(?:\[(?:\\.|[^\]\\]*)*\]|\\.)[^[/\\]*)*?\/[gim]*/.source ].join('|'), // - regex 'gm' // note: global+multiline with replace() need test ); // remove comments, keep other blocks function stripComments(str) { return str.replace(RE_BLOCKS, function (match, mlc, slc) { return mlc ? ' ' : // multiline comment (replace with space) slc ? '' : // single/multiline comment match; // divisor, regex, or string, return as-is }); } 

代码基于jspreproc的正则expression式,我为暴乱编译器编写了这个工具。

请参阅http://github.com/aMarCruz/jspreproc

如果你点击下面的链接,你会发现用正则expression式写的评论删除脚本。

这些代码共112行,与mootools,Joomla和drupal以及其他cms网站一起工作。 testing了800.000行代码和评论。 工作正常。 这个也select了多个括号,如(abc(/ nn /('/ xvx /'))“//testing线”)和冒号之间的注释并保护它们。 23-01-2016 ..! 这是带有注释的代码。

点击这里

基于上面的尝试和使用UltraEdit,主要是阿布舍克西蒙,我发现这个工作的内嵌评论和处理评论中的所有字符。

 (\s\/\/|$\/\/)[\w\s\W\S.]* 

这匹配注释在行的开始或在//之前的空格

// public static final String LETTERS_WORK_FOLDER =“/ Letters / Generated / Work”;

但不是

http://schemas.us.com.au/hub/”>“+

所以这只是不好的东西

if(x){f(x)} //其中f是一些函数

它只是需要

if(x){f(x)} //其中f是函数