Javascript node/io中复杂正则表达式的提取

Javascript node/io中复杂正则表达式的提取,javascript,regex,node.js,io.js,Javascript,Regex,Node.js,Io.js,这里有我尝试使用的库Twitter文本。 它有大量在运行时计算的复杂正则表达式。我不需要所有的库,所以我决定只使用其中的一些regexp 所以我有一个脚本来提取它并保存到另一个js文件: var _ = require('lodash'); var fs = require('fs'); var twitterText = require('twitter-text'); // 1.11.0 (latest) var content = [ '/**', ' * @pres

这里有我尝试使用的库Twitter文本。 它有大量在运行时计算的复杂正则表达式。我不需要所有的库,所以我决定只使用其中的一些regexp

所以我有一个脚本来提取它并保存到另一个js文件:

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);
有什么想法吗?尝试使用最新的节点和io。

此脚本似乎可以工作(它使用):

URL的结果regexp通过了原始包中的以下测试:

(结果应为空):

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

也许您想用
'regexps.+regexpName+'='+regexp.source+'试试它这似乎很难:)这里有一个关于unicode的优秀参考,它解释了很多:。我相信我的脚本生成了一个有效的regexp。我已经用原始twitter文本包中的一些测试用例成功地测试了它,明天我将检查所有剩余的测试用例。我尝试了你的解决方案,但它对我不起作用。(节点0.12.1)顺便问一下,您的系统是什么?(我的MacOS 10.9.5)对不起,我尝试了一下我的答案,在某个时候最后一行丢失了(
fs.writeFile(“./out.js”,content.join('\n'),{});
),所以曾经有效的输出根本没有更新。:)我已把我的答案改成正确的。您能检查一下它是否适合您吗?之前不仅缺少最后一行,而且还缺少这部分
require('js-string-escape')以及;)无论如何,
.url
仍然与推送到
内容的内容不同。在您的文件中,它以'- //' 然而,在原始版本中,使用“(”.
require('js-string-escape');
是故意删除的,因为我试图摆脱一个额外的依赖项……当您提到“原始文件”时你是说
twitter text.js
?我的输出不应该与
twitter text.js
中的定义完全匹配,因为那里使用了某种类型的正则表达式生成器(
regexreplacement
)。
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'), {});
node

> var r = require("./out.js");
undefined
> "www.google.com".match(r.url)
[ 'www.google.com' ]
> "something".match(r.url)
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
> 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.