选择评论

时间:2016-01-17 07:47:05

标签: javascript regex

我知道如何从文字中删除评论,但我正在寻找不同的内容。

我想选择除代码块之外的所有内容。

我使用了以下正则表达式:

/^(?!(\/\*([\s\S]+)\*\/)).*/gm

您可以在此处查看:https://regex101.com/r/cN5aT1/2

但它无法使用多行注释......

4 个答案:

答案 0 :(得分:3)

replace来自\/\*.*?\*\/的文字评论是有意义的。

虽然如果您确实需要它并假设这不会进入您的生产代码,您可以尝试

/([^*\/][^*\/][^*\/]*)(?=\/\*.*?\*\/|$)/gs

https://regex101.com/r/cN5aT1/6

答案 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;
&#13;
&#13;

答案 2 :(得分:1)

使用String#split()获取不应与特定模式匹配的文本的快速简便解决方案。

所以,我知道the best regex to match /* */ comments

/\/\*[^*]*\*+([^\/*][^*]*\*+)*\//g

然后,只需用正则表达式分割输入:

&#13;
&#13;
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;
&#13;
&#13;

答案 3 :(得分:0)

在JavaScript中检测注释并不是一个简单的解决方案,您不能单独依赖RegEx。只有正确的解析器(如Esprima)才能正确执行此操作。

最简单的方法是使用删除了所有注释的代码/内容。

为此您可以使用库decomment。它保证删除正确的注释,因为它依赖于Esprima来识别所有正则表达式:

var decomment = require('decomment');

var code = "var t; // comments";

decomment(code); //=> var t;

对于构建系统/任务运行者,请参阅gulp-decommentgrunt-decomment