Complex regex extraction in node/io

There is the library Twitter Text that I try to use. It has a tons of complex regexps that are calculated in runtime. I don't need all the library so I decided to just use some regexp from it.

So I have a script to extract it and save to another js file:

var _ = require('lodash');
var fs = require('fs');
var twitterText = require('twitter-text');   // 1.11.0 (latest)

var content = [
    '/**',
    ' * @preserve https://github.com/twitter/twitter-text-js',
    ' */',
    'var regexps = { };'
];

_.forEach({
    url: 'extractUrl',         // <- this regexp is the problem
    hash: 'validHashtag',
    mention: 'validMentionOrList'
}, function(twitterTextRegexpName, regexpName) {
    var regexp = twitterText.regexen[twitterTextRegexpName];

    if (undefined === regexp) {
        throw new Error('Failed to find regexp ' + twitterTextRegexpName);
    }

    content.push(
        'regexps.' + regexpName + ' = ' + regexp + ';'
    );
} );

content.push('export default regexps;');

fs.writeFile(targetPath, content.join('\n'), {}, callback);

So the result screenshot:

result

As you can see the url regexp is broken and I can't use module.

> require('./result');
.../result.js:5
regexps.url = /(((?:[^A-Za-z0-9@@$##‪-‮]|^))((https?:\/\/)?((?:(?:(?:[^\/\!
              ^
SyntaxError: Invalid regular expression: missing /
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:393:25)
    at Object.Module._extensions..js (module.js:428:10)
    at Module.load (module.js:335:32)
    at Function.Module._load (module.js:290:12)
    at Module.require (module.js:345:17)
    at require (module.js:364:17)
    at repl:1:1
    at REPLServer.defaultEval (repl.js:124:27)
    at bound (domain.js:254:14)

Any thoughts? Tried with latest node and io.

This script seems to work (it uses this package):

var _ = require('lodash');
var fs = require('fs');
var twitterText = require('twitter-text');   // 1.11.0 (latest)
jsStringEscape = require('js-string-escape');

var content = [
    '/**',
    ' * @preserve https://github.com/twitter/twitter-text-js',
    ' */',
    'var regexps = { };'
];

_.forEach({
    url: 'extractUrl',         // <- this regexp is the problem
    hash: 'validHashtag',
    mention: 'validMentionOrList'
}, function(twitterTextRegexpName, regexpName) {
    var regexp = twitterText.regexen[twitterTextRegexpName];

    if (undefined === regexp) {
        throw new Error('Failed to find regexp ' + twitterTextRegexpName);
    }

    var regexpStr = jsStringEscape(regexp.toString());
    var regexpRegexp  = /\/(.*)\/([^\/]*)/;  // :)
    var result = regexpStr.match(regexpRegexp);
    var regexpBody      = result[1];
    var regexpModifiers = result[2];
    content.push(
        'regexps.' + regexpName + ' = new RegExp("' + regexpBody + '","' + regexpModifiers + '");'
    );
} );

content.push('module.exports = regexps;');
fs.writeFile("./out.js", content.join('\n'), {});

Output:

node

> var r = require("./out.js");
undefined
> "www.google.com".match(r.url)
[ 'www.google.com' ]
> "something".match(r.url)
null

The resulting regexp for urls passes these tests from the original package:

Test for invalid characters in url (The result should be null):

var r = require("./out.js");
var invalidChars = ['\u202A', '\u202B', '\u202C', '\u202D', '\u202E'];
for (var i = 0; i < invalidChars.length; i++) {
    console.log(("http://twitt" + invalidChars[i] + "er.com").match(r.url));
}

// Result:
// null
// null
// null
// null
// null

Extract url test

> var r = require("./out.js");
> var message_with_hyphenated_url = "Message with hyphenated-url.com";
undefined
> var message_with_www_hyphenated_url = "Message with www.123-hyphenated-url.com";
undefined
> message_with_hyphenated_url.match(r.url)
[ ' hyphenated-url.com' ]
> message_with_www_hyphenated_url.match(r.url)
[ ' www.123-hyphenated-url.com' ]
// Load original regex:
> var twitterText = require('twitter-text');
undefined
> var rr = twitterText.regexen["extractUrl"];
undefined
> message_with_hyphenated_url.match(rr)
[ ' hyphenated-url.com' ]
> message_with_www_hyphenated_url.match(rr)
[ ' www.123-hyphenated-url.com' ]
// The same results as with original regex.