commentRegExp is not meant to be a general purpose regular expression for stripping comments.
If you are looking to strip comments in general, you should do what Mariano said, and use a JavaScript parser.
Why does RequireJS use this expression?
The understand why the regular expression is the way it is, you need to understand what it is used for. It is used in only one place in require.js:
callback
.toString()
.replace(commentRegExp, commentReplace)
.replace(cjsRequireRegExp, function (match, dep) {
deps.push(dep);
});
callback is the callback passed to a define call. For instance the single parameter of this call would be callback in the code above:
define(function (require) {});
The RequireJS code I've quoted has for only goal to provide support for the CommonJS-style of importing modules. It goes over the source of the callback and looks for all instance of require calls that have a single parameter which is a string literal. If you have code written in the CommonJS form:
var foo = require("foo");
var bar = require("bar");
// Do stuff with foo and bar.
exports.q = "something";
you can just wrap it in define:
define(function (require, exports, module) {
var foo = require("foo");
var bar = require("bar");
// Do stuff with foo and bar.
exports.q = "something";
});
Although the require calls look like they are loading modules synchronously, RequireJS always loads modules asynchronously, so in order to have the require calls to work, RequireJS performs a computation that makes the above equivalent to the following:
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";
});
The array that appears before the callback is the list of dependencies for the module being defined by define. The modules require, exports and module are special modules that are always defined and provide the values to pass to callbacks that use the CommonJS syntax. Then the modules that appeared in require calls are added to the list of dependencies. This means that all modules that appear in require calls in callback passed to define are loaded before the callback runs. So when var foo = require("foo") executes, RequireJS is not loading the module but just fetching it from its cache of modules.
The regular expression you are looking at is used only for the purpose of doing the computation I just described. It allows cases like these to be detected and properly handled by RequireJS:
require("foo" /* something */);
require(// Something
"foo");
Mariano has already pointed out that although commentRegExp has a provision to not avoid taking '//:' as a comment, it will mangle things like:
var b = "this is //not a comment matched";
For the purpose it is meant to be used, it does not matter. The cjsRequireRegExp expression that is used after commentRegExp is only looking for require calls. So even if a case like the one above happens, it is without consequence because cjsRequireRegExp won't match it. The reason it does not match :// is so that this works:
require("http://foo.com/something")
What about the following?
require("lib//something")
The regular expression will strip from '//' to the end of the line, true.
However, '//' is equivalent to '/' so Just make the module name lib/something.
RequireJS is using regular expressions rather than a JavaScript parser because: a) it would considerably slow down module loading, and b) including such a parser in require.js would make it much bigger than it currently.