所有使用正则表达式的答案在这里都完全失败了,有几种情况。
var myString = '/*Hello World!*/';
var a = "/*b", c = /.*/g;
alert("This will not fire with the regular expressions, but works in JS");
varb = 5;
对于一些比较明显的情况,正则表达式并不足以正确解析注释,需要了解语言的语法。
那么,如果正则表达式失败了,还剩什么?解析器。难吗?其实不难。
让我们自己来看看 JavaScript 语法!关于注释的
部分如下所述:
MultiLineComment ::
/* MultiLineCommentCharsopt */
这是好的,这意味着当我们在多行注释内时,直到遇到
*/
才退出注释,然后立即退出。
但是注释什么时候出现?几乎可以出现在除了文字字面量外的任何地方。在我们有的 5 种文字字面量之外,多行注释标记只能出现在字符串字面量和正则表达式字面量中。
function parse(code) else if (c[i] === "\\") else
} else if(isInRegExp) else if (c[i] === "\\") else
} else if (isInComment)
} else
} else if(c[i] === "/" && c[i+1] === "*") else if(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
/\/\*.*\*\//
表示贪婪匹配,使用/\/\*.*?\*\//
表示非贪婪匹配。 - user557597