我需要一个正则表达式或其他东西来删除这种评论。
/*!
* Foo Bar
*/
我尝试使用/(\/*!.**\/)/m
但失败了。有什么建议吗?
答案 0 :(得分:3)
要准确地做到并且有效,有一个更好的正则表达式:
regexp = /\/\*![^*]*\*+(?:[^*\/][^*]*\*+)*\//
result = subject.gsub(regexp, '')
Jeffrey Friedl在他的经典作品Mastering Regular Expressions (3rd Edition)中详细介绍了这个具体问题(以C-comments为例)。下面是正则表达式的细分,它说明了“展开循环”效率技术。
regexp_long = / # Match she-bang style C-comment
\/\*! # Opening delimiter.
[^*]*\*+ # {normal*} Zero or more non-*, one or more *
(?: # Begin {(special normal*)*} construct.
[^*\/] # {special} a non-*, non-\/ following star.
[^*]*\*+ # More {normal*}
)* # Finish "Unrolling-the-Loop"
\/ # Closing delimiter.
/x
result = subject.gsub(regexp_long, '')
请注意,此正则表达式不需要Ruby的'm'点匹配所有修饰符,因为它不使用点!
附加:那么这个正则表达式对简单/\/\*!.*?\*\//m
表达式的效率有多高?好吧,使用RegexBuddy调试器,我测量了每个正则表达式与评论匹配的步数。以下是匹配和非匹配的结果:(对于非匹配的情况,我只是删除了评论中的最后一个/
)
/*!
* This is the example comment
* Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar
* Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar
* Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar
*/
'
REGEX STEPS TO: MATCH NON-MATCH
/\/\*!.*?\*\//m 488 491
/\/\*![^*]*\*+(?:[^*\/][^*]*\*+)*\// 23 29
'
正如你所看到的,懒惰点解决方案(必须为评论中的每个字符回溯一次),效率要低得多。另请注意,对于更长和更长的评论,效率差异更加明显。
CAVEAT 请注意,如果开头分隔符出现在文字字符串中,则此正则表达式将失败,例如“这个字符串中有一个/ *!!”。要以100%的准确度正确执行此操作,您需要完全解析脚本。
答案 1 :(得分:2)
*
必须进行转义,否则会匹配零次或多次/
次(如果是\/*
)。 .**
中也存在语法错误。尝试使用*
正确转义的下一个RE:
/\/\*!.*?\*\//m
答案 2 :(得分:2)
答案 3 :(得分:1)
用于删除(c风格)单行和多行注释的简单regexp。但请注意,这些非常简单 - 例如,他们不会在字符串文字中使用/ * * /。但是应该可以从一个简单的代码中删除注释:
str.gsub!(/\/\*.*?\*\//m, '') # remove multiline comments
str.gsub!(/\s*\/\/.*/, '') # remove single-line comments
答案 4 :(得分:0)
你可以使用像YUI压缩或Google Closure Compiler
这样的javascript压缩器答案 5 :(得分:0)
嗯,我想我得到了你想要的东西:)
<html>
<head>
<title>Code Condenser</title>
<style type="text/css">
#source{font-size:10pt;width:90%;height:300px;}
body{text-align:center;}
</style>
<script type="text/javascript">
function vc_js_condenser(){var a=/[a-zA-Z0-9._'"]/;var b=/[a-zA-Z0-9._]/;var c=/[a-zA-Z0-9._\]\)"']/;
function d(e,f){e=e.replace(/[\n\r]+/g,"\n");var g=(typeof(f)=="boolean")?f:false;var h=["var","else",
"new","do","case","with","typeof","delete","try","finally","throw","in","instanceof"];var i=0;var j=
new Array();var k=e.split('');l=k.length;var m=new Array();var G=null;var o=false;var p=[["'","'","\\"]
,['"','"','\\'],["//","\n",null],["/*","*/",null]];var q="[](){},;/\n";var r;function s(){if(m.length<1)
return;var u=m.join('');if((!g)||((u.match(/^\/\//)==null)&&(u.match(/^\/\*/)==null))){if(!((u=="\n")&&
((G==';')||(G=="\n")))){if((G!=null)&&(G.match(a)!=null)&&(u.match(a)!=null))j[j.length]=' ';j[j.length]
=u;G=u;}}m.length=0;v=false;}var v=false;var w=false;while(i<l){if(!o){if((k[i]==" ")||(k[i]=="\t")){s();
}else{var x=false;if(q.indexOf(k[i])>-1){if(k[i]!='/'){x=true;s();}else if((m.length>0)&&(m[0]!='/')){
s();}}for(var y=0;y<p.length;y++){var z='';if((m.length>0)&&(m[m.length-1]==p[y][0].charAt(0)))z=m[
m.length-1];var A=z+k[i];if(A==p[y][0]){o=true;r=y;if(z!='')m.length--;if(m.length>0)s();if(z!='')m
[m.length]=z;break;}}if((k[i]=="/")&&(!o)&&(m.length==0)&&(G!=null)&&(G.match(c)==null)&&(i+1<k.length)
&&(k[i+1]!='/')){o=true;r=null;}var B=k[i].match(b)!=null;if(m.length<1)v=B;if(v!=B){s();v=B;}m[m.length]
=k[i];if(x)s();}}else{m[m.length]=k[i];var C=m.join('');if(r!=null){var D=C.lastIndexOf(p[r][1]);if((D!=-1)
&&(D>0)){if(m[D-1]==p[r][2]){if((D>2)&&(m[D-2]==p[r][2])){s();o=false;}}else{s();o=false;}}}else{if((w==false)
&&(k[i]=="/")){i++;while((i<k.length)&&(k[i].match(b)!=null)){m[m.length]=k[i];i++;}s();o=false;i--;}else{if
(!w&&(k[i]=="\\"))w=true;else w=false;}}}i++;}s();var E=-1;for(var i=0;i<j.length;i++){var u=j[i];var
F=(i>0)?j[i-1]:null;var n=(i<(j.length-1))?j[i+1]:null;if(u=="\n"){if((F!=null)&&(n!=null)){if((F.match(c)
!=null)&&(n.match(a)!=null)){u=';';for(var H=h.length-1;H>-1;H--){if(F==h[H])u=' ';}j[i]=u;E++;if((E<j.length)
&&(E>-1)&&(i!=E))j[E]=j[i];}}}else{E++;if((E<j.length)&&(E>-1)&&(i!=E))j[E]=j[i];}}j.length=E+1;return j;}var
I=document.getElementById('source');var J=I.value.length;I.value=d(I.value,document.getElementById('uncomment').checked
==true).join('');var K=I.value.length;var F=document.getElementById("saved");F.removeChild(F.firstChild);var
L=document.createElement("span");F.appendChild(L);L.appendChild(document.createTextNode("Original Size: "+
J+" characters"));L.appendChild(document.createElement("br"));L.appendChild(document.createTextNode(
"Condensed Size: "+K+" characters"));L.appendChild(document.createElement("br"));L.appendChild(
document.createTextNode("Size Difference: "+(J-K)+" characters"));if(J!=0){L.appendChild(document.createElement
("br"));L.appendChild(document.createTextNode("Condensed Code is "+(Math.floor(K/J*10000)/100)+
"% of original size."));}}
</script>
</head>
<body>
<h1>JavaScript Source Code Condenser</h1>
<p>Paste only valid Javascript (no HTML tags) in the box below.</p>
<button onclick="vc_js_condenser();">Condense Code</button> <input type="checkbox" checked="checked" id="uncomment" />Remove Comments <button onclick="document.getElementById('source').select();">Select All</button><br />
<textarea id="source"></textarea><br />
<p id="saved"><span></span></p>
</body>
</html>
请将此脚本保存为HTML,然后在浏览器中运行,然后复制您的javascript并将其放入texterea,然后使用按钮压缩它
此代码将删除代码中的空格和注释,因此请不要忘记结束您的功能;避免语法错误。
这将帮助你减少你的javascript文件大小,这将把你的javascript放在1行,所以如果你需要它回来形成你可以在Firefox中使用这个插件如果你使用它 http://www.formatjavascript.com/
问候:) 如果您认为这个答案有用,请将此答案标记为正确答案
答案 6 :(得分:0)
我强烈建议您使用Google's Closure Compiler删除这些评论,我已将它用于制作中并且非常棒。