javascript使用regex删除注释
requirejs源代码: 使用下面的代码删除注释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 */
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
调用