如何在JavaScript中使用正则表达式从字符串中删除类似的内容?
/*
multi-line comment
*/
这就是我的尝试:
var regex = /(\/\*(^\*\/)*\*\/)/g;
string = string.replace(regex, '');
答案 0 :(得分:3)
如果您想匹配/*
后跟任意数量的不包含*/
的文字,后跟*/
,那么您可以使用正则表达式,但它会不正确删除JavaScript中的块注释。
我描述的模式失败的一个简单示例是:
var a = '/*'; /* block comment */
请注意,即使第一个/*
包含在字符串中,它也会匹配。如果您可以保证您在其中搜索的内容不包含此类不一致,或者只是使用正则表达式来查找要进行手动更改的位置,那么您应该相当安全。否则,不要使用正则表达式,因为在这种情况下它们是错误的工作工具; 你被警告。
要构建正则表达式,您只需将我的第一句话分解为其复合部分。
/
启动正则表达式文字\/\*
与文字字符/*
[\s\S]*?
以非贪婪的方式匹配任何字符\*\/
与文字字符*/
/
结束正则表达式总之,你最终得到:
/\/\*[\s\S]*?\*\//
非贪婪匹配是必要的,以防止在多个块注释位于文件中时捕获关闭注释(*/
):
/* foo */
var foo = 'bar';
/* fizz */
var fizz = 'buzz';
使用非贪婪匹配,
/* foo */
和
/* fizz */
将匹配,没有非贪婪的匹配,
/* foo */
var foo = 'bar';
/* fizz */
会匹配。
答案 1 :(得分:3)
在几种情况下,使用正则表达式的所有答案都完全失败:
var myString = '/*Hello World!*/'; // inside a string
var a = "/*b", c = /.*/g; // inside a string partially, and inside a regex literal
// /*
alert("This will not fire with the regular expressions, but works in JS");
// */
var/**/b = 5; // perfectly valid, replacing a comment with nothing is simply incorrect
对于一些比较明显的人。正则表达式不够强大,无法正确解析注释,他们需要了解语言语法。
所以,正则表达式失败了,还剩下什么?解析器。难吗?不是真的。
让我们自己看一下JavaScript语法吧! section on comments州:
MultiLineComment ::
/* MultiLineCommentCharsopt */
这很好,这意味着当我们进入多行注释时,我们不会退出它,直到我们到达*/
然后我们立即退出它。
但什么时候可以发表评论?几乎在文字之外的任何地方。在我们所拥有的5个文字中,多行注释标记只能出现在字符串文字和正则表达式文字中。
function parse(code){
// state
var isInRegExp = false;
var isInString = false;
var terminator = null; // to hold the string terminator
var escape = false; // last char was an escape
var isInComment = false;
var c = code.split(""); // code
var o = []; // output
for(var i = 0; i < c.length; i++){
if(isInString) { // handle string literal case
if(c[i] === terminator && escape === false){
isInString = false;
o.push(c[i]);
} else if (c[i] === "\\") { // escape
escape = true;
} else {
escape = false;
o.push(c[i]);
}
} else if(isInRegExp) { // regular expression case
if(c[i] === "/" && escape === false){
isInRegExp = false;
o.push(c[i]);
} else if (c[i] === "\\") {
escape = true;
} else {
escape = false;
o.push(c[i]);
}
} else if (isInComment) { // comment case
if(c[i] === "*" && c[i+1] === "/"){
isInComment = false;
i++;
// Note - not pushing comments to output
}
} else { // not in a literal
if(c[i] === "/" && c[i+1] === "/") { // single line comment
while(c[i] !== "\n" && c[i] !== undefined){ //end or new line
i++;
}
} else if(c[i] === "/" && c[i+1] === "*"){ // start comment
isInComment = true;
o.push(" "); // add a space per spec
i++; // don't catch /*/
} else if(c[i] === "/"){ // start regexp literal
isInRegExp = true;
o.push(c[i]);
} else if(c[i] === "'" || c[i] === '"'){ // string literal
isInString = true;
o.push(c[i]);
separator = c[i];
} else { // plain ol' code
o.push(c[i]);
}
}
}
return o.join("");
}
我刚刚在控制台中写了这个,很长 - 但你能看出它有多简单吗?这在概念上非常简单 - 它只是跟踪代码中的位置,并基于消耗这个词。
我们试一试:
parse("var a = 'hello world'"); // var a = 'hello world'
parse("var/**/a = 'hello world'"); // var a = 'hello world'
parse("var myString = '/*Hello World!*/';"); // var myString = '/*Hello World!*/';
parse('var a = "/*b", c = /.*/g;'); // var a = "/*b", c = /.*/g;
parse("var a; /* remove me please! */"); // var a;
parse("var x = /* \n \n Hello World Multiline String \n \n */ 5"); // var x = 5
答案 2 :(得分:-1)
以下将从Javascript中删除命令和垃圾邮件。
var regex = /^(\s*[^\s]*\s*)$/g;
string = string.replace(regex, '');
希望这会有所帮助......