我本来这样写的:
var s = "var a = 'test'; // 1234678"
s.replace(/\/\/[\s\S]*?\n?$/,'');
后来发现,代码中还有这样的代码:
var a = '://'+host;// 123456
var s = " // tset "; // test
var a = 'http://www.a.com//b/c';
所以好复杂啊,不知道这正则该怎么写了==
网友回答:
zonxin 2018-4-20 11:33 回复:
JS的正则不支持
(?'xx')
和(?-‘xx’)
感觉不太好表示状态,所以自己解析代码吧
jsoncode 2018-4-20 12:04 回复:
自己写了这样的代码,目前是能解决已经想到的代码匹配了,肯定还有坑
str.replace(/[\x20\S]*\/\/[\x20\S]*?\n?$/gm, function(v) {
if (/^\x20*\/\/|^\x20*\/\//.test(v)) { return '' }
if (/[,;]\x20*\/\//.test(v)) { return v.replace(/([,;])\x20*\/\/[\x20\S]*?\n?$/m, '$1') }
return v
})
后来又发现了这样的代码:
{
a:"aa",
b:"bb"//目标字段名
}
wtf
Untitled 2018-4-20 12:34 回复:
要写出适用所有情况的正则是不可能的,正则表达式不能解决类似括号、引号匹配的问题,而如果要解决你的问题,又要适用所有情况,包括一行内故意写了多个字符串等情况,不做语法分析是不可能的,但你仍然可以用正则解决部分问题,一些特殊的情况是可以解决的,可以试试断言什么的
wmaker 2018-4-20 12:37 回复:
做了很多尝试,看看这个。
removeComment(`' : //'+host;// 123456`); // ' : //'+host;
function removeComment(str) {
const reg = /("([^\\\"]*(\\.)?)*")|('([^\\\']*(\\.)?)*')|(\/{2,}.*?(\r|\n|$))|(\/\*(\n|.)*?\*\/)/g;
return str.replace(reg, function(s) {
return /^\/{2,}/.test(s) || /^\/\*/.test(s) ? "" : s;
});
}