Javascript 注释剥离器 [已关闭]

问题描述 投票:0回答:7

我正在寻找一些工具来从 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;
javascript comments
7个回答
13
投票

SO是一场狗屎秀。感谢您的搭车。


10
投票

将 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");

2
投票

在这里找到了一个非常甜蜜的解决方案:http://blog.ostermiller.org/find-comment

摘录:

现在我们只需要修改注释末尾以允许任意数量的*:

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

我们现在有了一个正则表达式,可以将其粘贴到支持正则表达式的文本编辑器中。只需按下查找按钮即可找到我们的评论。您也许可以为您的特定编辑器稍微简化此表达式。例如,在某些正则表达式实现中,[^] 假定 [ ] 和所有的 [ ] 可以从表达式中删除。

这很容易增强,以便它也能找到 // 样式注释:

(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*)

但是,请务必阅读注意事项,因为这会删除带有注释的注释,或者可能会错误地取消注释代码。不过,对我来说效果很好:-)


2
投票

图书馆decomment完全符合您的描述:

其他所有内容都应保留原样,特别是不删除空格,但如果注释占据整行,则该行也会被删除。

并且它还支持 JSON5、JavaScript ES6、CSS 和 HTML。


2
投票

你可以使用 babel

"comments": false
来实现这一点。我已经为
the-super-tiny-compiler
写了一个demo,请查看https://github.com/gengjiawen/the-super-tiny-compiler

安装 deps 后运行

npm run remove-comments


1
投票

天真的一个衬垫剥离器:

var noComments = text.replace(/\/\*(.|[\r\n])*?\*\//g, '').replace(/\/\/.*/gm, '');

免责声明:

“天真”的意思是:

  1. 它遍布各处,如果你有:

    var a = "/*";
    someImportantLogicHere();
    var b = "*/";
    

    然后你会得到

    var a = "";
    
  2. 应用这些正则表达式的顺序很重要,以不同的顺序应用它会得到不同的结果

但对于 95% 的其他情况,它是简单实用的


0
投票

一个小小的见解可能会帮助您使复杂的正则表达式变得更简单..

稍后请随意应用上面答案中的任何提示..

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
m
修饰符(全局和“贪婪”标志),您仍然无法成功删除注释(除非您自定义构建“character-walker”循环,或运行相同的reg- ex 多次...) 这是由于自 ECMAScript 4 (ECMA-262)

以来正则表达式匹配的一些特征一直处于不确定状态

这里有哪些值得一提的聪明事?

这样,我们应用了离散数学(语言和语法)中称为“语法之外的替换”的巧妙小技巧,我非常规地使用它来“保护”文本中的

\r
\n
区域,而无需实际上应用了太多的计算能力来处理它们(如切割/组装等)

这里这是一场赌博,因为本质上,

##R##
##N##
(虽然不那么常见)可能是现有的短语,但这不是问题,因为替换可能无限复杂。

简而言之, 正则表达式会更简单, 常规替换将按预期工作,而不会出现空格错误。 并且

\n
\r
将完好无损地恢复到原来的位置。

© www.soinside.com 2019 - 2024. All rights reserved.