js正则怎么删除单行注释?

我本来这样写的:

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';

所以好复杂啊,不知道这正则该怎么写了==

阅读 4k
4 个回答

JS的正则不支持(?'xx')(?-‘xx’) 感觉不太好表示状态,所以自己解析代码吧

自己写了这样的代码,目前是能解决已经想到的代码匹配了,肯定还有坑

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

要写出适用所有情况的正则是不可能的,正则表达式不能解决类似括号、引号匹配的问题,而如果要解决你的问题,又要适用所有情况,包括一行内故意写了多个字符串等情况,不做语法分析是不可能的,但你仍然可以用正则解决部分问题,一些特殊的情况是可以解决的,可以试试断言什么的

做了很多尝试,看看这个。

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; 
  });
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题