我知道如何从文字中删除评论,但我正在寻找不同的内容。
我想选择除代码块之外的所有内容。
我使用了以下正则表达式:
/^(?!(\/\*([\s\S]+)\*\/)).*/gm
您可以在此处查看:https://regex101.com/r/cN5aT1/2
但它无法使用多行注释......
答案 0 :(得分:3)
replace
来自\/\*.*?\*\/
的文字评论是有意义的。
虽然如果您确实需要它并假设这不会进入您的生产代码,您可以尝试
/([^*\/][^*\/][^*\/]*)(?=\/\*.*?\*\/|$)/gs
答案 1 :(得分:1)
删除评论
使用带有以下正则表达式的*
函数删除每个css注释(in或extra block以及里面有replace
):
/\s*[/][*](?:[^*]|[*][^/])*[*][/][ \t]*/g
正则表达式突破 Regex101 Demo
/ # Regex start delimiter
\s* # select any whitespace char (including the newlines preceding the comment)
[/][*] # match comment start delimiter '/*'
(?:[^*]|[*][^/])* # select zero or more not star ('*') chars (also newlines)
# or a star and the following char (that is not '/')
[*][/] # match comment stop delimiter '*/'
[ \t]* # match any space or tabs (no newlines to preserve indentations)
/g # Regex close delimiter and global flag
关于性能:下面的代码比使用延迟修饰符的其他答案中建议的代码快14倍:
Live Js演示
var filter = /\s*[/][*](?:[^*]|[*][^/])*[*][/][ \t]*/g;
var input = '.class-n {\n\n}\n\n/* Select everything but these comments */\n\n.class-1 {\n font-family: \'SourceCodePro\';\n font-size: 16px; /* a comment with\n **stars***** */\n line-height: 18px;\n}\n\n/* Select everything but these comments */\n\n.class-2 {\n background-color: rgb(40, 40, 40); /* another\n inline comments that\nspans on multiple lines */\n border: 1px solid rgb(20, 20, 20);\n padding: 10px 15px 10px 15px;\n}\n\n/* Single line */\n\n/* Multiline\n Comment */\n';
var output = input.replace(filter,'');
document.getElementById('input').innerHTML += '<xmp>' + input + '</xmp>';
document.getElementById('output').innerHTML += '<xmp>' + output + '</xmp>';
&#13;
.flexbox-container {
display: -ms-flex;
display: -webkit-flex;
display: flex;
}
.flexbox-container > div {
width: 50%;
padding: 15px;
border:1px solid black;
}
.flexbox-container > div:first-child {
margin-right: 15px;
}
&#13;
<div class="flexbox-container">
<div id="input"><h3>Original Css</h3></div>
<div id="output"><h3>Stripped Css</h3></div>
</div>
&#13;
答案 2 :(得分:1)
使用String#split()
获取不应与特定模式匹配的文本的快速简便解决方案。
所以,我知道the best regex to match /* */
comments是
/\/\*[^*]*\*+([^\/*][^*]*\*+)*\//g
然后,只需用正则表达式分割输入:
var re = /\/\*[^*]*\*+([^\/*][^*]*\*+)*\//g;
var s = '.class-n {\n\n}\n\n/* I want to select everything but these comments */\n\n.class-1 {\n font-family: \'SourceCodePro\'; \n font-size: 16px;\n line-height: 18px;\n}\n\n/* I want to select everything but these comments */\n\n.class-2 {\n background-color: rgb(40, 40, 40);\n border: 1px solid rgb(20, 20, 20);\n padding: 10px 15px 10px 15px;\n}\n\n/* Single line */\n\n/* Multiline\n Comment */\n\nSome text here';
var res = s.split(re).filter(Boolean);
document.body.innerHTML += "<pre>"+JSON.stringify(res, 0, 4)+"</pre>";
&#13;
答案 3 :(得分:0)
在JavaScript中检测注释并不是一个简单的解决方案,您不能单独依赖RegEx。只有正确的解析器(如Esprima)才能正确执行此操作。
最简单的方法是使用删除了所有注释的代码/内容。
为此您可以使用库decomment。它保证删除正确的注释,因为它依赖于Esprima来识别所有正则表达式:
var decomment = require('decomment');
var code = "var t; // comments";
decomment(code); //=> var t;
对于构建系统/任务运行者,请参阅gulp-decomment和grunt-decomment。