js正则怎么删除单行注释

2018-04-20 11:21:23正则表达式问题

我本来这样写的:

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 zonxin 2018-4-20 11:33 回复:

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


  • jsoncode 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 Untitled 2018-4-20 12:34 回复:

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


  • wmaker 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; 
  });
}