javascript使用regex删除注释

javascript使用regex删除注释,javascript,regex,requirejs,comments,Javascript,Regex,Requirejs,Comments,requirejs源代码: 使用下面的代码删除注释 var commentRegExp = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg; function commentReplace(match, multi, multiText, singlePrefix) { return singlePrefix || ''; } // for example var funcName = function(){ /* comment */

requirejs源代码:

使用下面的代码删除注释

var commentRegExp = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg;

function commentReplace(match, multi, multiText, singlePrefix) {
    return singlePrefix || '';
}

// for example

var funcName = function(){
    /* comment */
    console.log('comment') // comment
    return 'delete comment'
}

funcName.toString().replace(commentRegExp,commentReplace);
我想知道为什么commentRegExp是

/(\/\*([\s\s]*?)\*\/\([^:][124;^)\/\/(.*)/mg

而不是

/(\/\*([\s\s]*?)\*\/\/\/(.*)/mg

这样我们就可以使用

funcName.toString().replace(/(\/\*([\s\s]*?)\*\/\/\/(.*))/mg',)

而不是

funcName.toString().replace(commentRegExp,commentReplace)

谁能告诉我
([^:]|^)
/([\s\s]*?)\*/|([^:]|^^)\/\/(.*)/mg
([^:]|^)
中的角色在行首匹配,或者匹配的字符不是冒号(

它是用来防止匹配URL的,比如

var a = "http://url.com";
([^:]|^)
还捕获匹配的文本,以便使用backreference
$3
替换该字符


但请注意,此表达式也将匹配一些非注释的情况,例如引号之间的情况

var b = "this is //not a comment matched";

您应该。

([^:]|^)
匹配行首或非冒号的字符(

它是用来防止匹配URL的,比如

var a = "http://url.com";
([^:]|^)
还捕获匹配的文本,以便使用backreference
$3
替换该字符


但请注意,此表达式也将匹配一些非注释的情况,例如引号之间的情况

var b = "this is //not a comment matched";


您应该这样做。

commentRegExp
不是用于剥离注释的通用正则表达式。

如果您希望从总体上剥离注释,那么应该按照所说的做,并使用JavaScript解析器

为什么RequireJS使用这个表达式? 要理解正则表达式为何如此,您需要理解它的用途。它仅在
require.js
中使用:

callback
    .toString()
    .replace(commentRegExp, commentReplace)
    .replace(cjsRequireRegExp, function (match, dep) {
        deps.push(dep);
    });
callback
是传递给
define
调用的回调。例如,在上面的代码中,此调用的单个参数是
callback

define(function (require) {});
我引用的RequireJS代码的唯一目的是为导入模块的CommonJS样式提供支持。它检查回调的源代码,并查找所有具有单个参数(字符串文本)的
require
调用实例。如果您有以CommonJS格式编写的代码:

var foo = require("foo");
var bar = require("bar");
// Do stuff with foo and bar.

exports.q = "something";
您只需将其包装在
定义中即可:

define(function (require, exports, module) {
  var foo = require("foo");
  var bar = require("bar");
  // Do stuff with foo and bar.

  exports.q = "something";
});
尽管
require
调用看起来像是在同步加载模块,但RequireJS总是异步加载模块,因此为了让
require
调用正常工作,RequireJS执行一个计算,使上面的计算等价于以下内容:

define(["require", "exports", "module", "foo", "bar"], function (require, exports, module) {
  var foo = require("foo");
  var bar = require("bar");
  // Do stuff with foo and bar.

  exports.q = "something";
});
回调之前显示的数组是由
define
定义的模块的依赖项列表。模块
require
exports
module
是特殊的模块,它们总是被定义,并提供传递给使用CommonJS语法的回调的值。然后,出现在
require
调用中的模块被添加到依赖项列表中。这意味着在
中出现的所有模块都需要在传递给
define
的回调中调用
,并在回调运行之前加载。因此,当执行
var foo=require(“foo”)
时,RequireJS不是加载模块,而是从模块缓存中获取模块

您正在查看的正则表达式仅用于执行我刚才描述的计算。它允许RequireJS检测并正确处理此类情况:

require("foo" /* something */);
require(// Something
        "foo");
已经指出,虽然
commentRegExp
有一条规定,不能避免将“/:”作为注释,但它会破坏以下内容:

var b = "this is //not a comment matched";
就其使用目的而言,这并不重要。在
commentRegExp
之后使用的
cjsRequireRegExp
表达式仅查找
require
调用。因此,即使发生上述情况,也不会产生任何后果,因为
cjsRequireRegExp
不会匹配它。它不匹配的原因是:

require("http://foo.com/something")
下面呢

require("lib//something")
正则表达式将从“/”剥离到行尾,true。 但是,“//”相当于“/”,因此只需将模块名设置为
lib/something


RequireJS使用正则表达式而不是JavaScript解析器,因为:a)它会大大降低模块加载速度,b)在
require.js
中包含这样一个解析器将使其比当前的解析器大得多。

commentRegExp
并不是用于剥离注释的通用正则表达式。

如果您希望从总体上剥离注释,那么应该按照所说的做,并使用JavaScript解析器

为什么RequireJS使用这个表达式? 要理解正则表达式为何如此,您需要理解它的用途。它仅在
require.js
中使用:

callback
    .toString()
    .replace(commentRegExp, commentReplace)
    .replace(cjsRequireRegExp, function (match, dep) {
        deps.push(dep);
    });
callback
是传递给
define
调用的回调。例如,在上面的代码中,此调用的单个参数是
callback

define(function (require) {});
我引用的RequireJS代码的唯一目的是为导入模块的CommonJS样式提供支持。它检查回调的源代码,并查找所有具有单个参数(字符串文本)的
require
调用实例。如果您有以CommonJS格式编写的代码:

var foo = require("foo");
var bar = require("bar");
// Do stuff with foo and bar.

exports.q = "something";
您只需将其包装在
定义中即可:

define(function (require, exports, module) {
  var foo = require("foo");
  var bar = require("bar");
  // Do stuff with foo and bar.

  exports.q = "something";
});
尽管
require
调用看起来像是在同步加载模块,但RequireJS总是异步加载模块,因此为了让
require
调用