正则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式,我为暴乱编译器编写了这个工具。
如果你点击下面的链接,你会发现用正则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”;
但不是
所以这只是不好的东西
if(x){f(x)} //其中f是一些函数
它只是需要
if(x){f(x)} //其中f是函数