我正在寻找一些工具来从 Javascript 源中删除 cooments。我能够谷歌一些,但没有一个满足以下要求:其他所有内容都应保留原样,特别是不删除空格,但如果注释占据整行,则该行也会被删除。
简而言之,我希望能够从带有注释的格式良好的源到没有注释的格式相同的源。仅包含注释的行将被删除,尾随注释连同尾随空格将被删除。其余的都保持原样。
你知道有什么工具可以完成这样的工作吗?
编辑:我尝试更具体。使用正则表达式是不可能的,因为字符
//
或 /*
也可以出现在字符串、正则表达式等内部。
该工具应接受此输入
var a = true;
//the following code is every useful
var b = 2;//really, really useful
/**
Never, ever do this
var c = 3;
*/
var d = 4;
并给出这个输出
var a = true;
var b = 2;
var d = 4;
SO是一场狗屎秀。感谢您的搭车。
将 Google 的 Closure Compiler 与 WHITE_SPACE_ONLY 和 PRETTY_PRINT 一起使用 - 它唯一能做的就是删除注释(当然,除非您不按照 PRETTY_PRINT 的方式格式化代码。)
变成这样:
// This function alerts a name
function hello(name) {
/**
* One lone
* multi-line
* comment
*/
alert('Hello, ' + name);
}
hello('New user');
进入此:
function hello(name) {
alert("Hello, " + name)
}
hello("New user");
在这里找到了一个非常甜蜜的解决方案:http://blog.ostermiller.org/find-comment
摘录:
现在我们只需要修改注释末尾以允许任意数量的*:
/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/
我们现在有了一个正则表达式,可以将其粘贴到支持正则表达式的文本编辑器中。只需按下查找按钮即可找到我们的评论。您也许可以为您的特定编辑器稍微简化此表达式。例如,在某些正则表达式实现中,[^] 假定 [ ] 和所有的 [ ] 可以从表达式中删除。
这很容易增强,以便它也能找到 // 样式注释:
(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*)
但是,请务必阅读注意事项,因为这会删除带有注释的注释,或者可能会错误地取消注释代码。不过,对我来说效果很好:-)
图书馆decomment完全符合您的描述:
其他所有内容都应保留原样,特别是不删除空格,但如果注释占据整行,则该行也会被删除。
并且它还支持 JSON5、JavaScript ES6、CSS 和 HTML。
你可以使用 babel
"comments": false
来实现这一点。我已经为the-super-tiny-compiler
写了一个demo,请查看https://github.com/gengjiawen/the-super-tiny-compiler。
安装 deps 后运行
npm run remove-comments
。
天真的一个衬垫剥离器:
var noComments = text.replace(/\/\*(.|[\r\n])*?\*\//g, '').replace(/\/\/.*/gm, '');
免责声明:
“天真”的意思是:
它遍布各处,如果你有:
var a = "/*";
someImportantLogicHere();
var b = "*/";
然后你会得到
var a = "";
应用这些正则表达式的顺序很重要,以不同的顺序应用它会得到不同的结果
但对于 95% 的其他情况,它是简单实用的
稍后请随意应用上面答案中的任何提示..
var text = ".................."; //assuming staring point
........
text = text
.replace(/\r/g,"##R##")
.replace(/\n/g,"##N##")
.replace(/\/\*(.*)\*\//g,"")
.replace(/##R##/g,"\r")
.replace(/##N##/g,"\n")
应用一点(独立)替换
\r
和 \n
将简化您的正则表达式 很多!,
最初,即使使用
和g
修饰符(全局和“贪婪”标志),您仍然无法成功删除注释(除非您自定义构建“character-walker”循环,或运行相同的reg- ex 多次...) 这是由于自 ECMAScript 4 (ECMA-262) 以来正则表达式匹配的一些特征一直处于不确定状态m
这里有哪些值得一提的聪明事?
这样,我们应用了离散数学(语言和语法)中称为“语法之外的替换”的巧妙小技巧,我非常规地使用它来“保护”文本中的
\r
和 \n
区域,而无需实际上应用了太多的计算能力来处理它们(如切割/组装等)
这里这是一场赌博,因为本质上,
##R##
和##N##
(虽然不那么常见)可能是现有的短语,但这不是问题,因为替换可能无限复杂。
简而言之, 正则表达式会更简单, 常规替换将按预期工作,而不会出现空格错误。 并且
\n
和 \r
将完好无损地恢复到原来的位置。