通过UglifyJS枚举正则表达式

vit*_*y-t 7 javascript uglifyjs

我有一些JavaScript代码,我需要从中找到每个文字正则表达式的起始+结束索引.

如何从UglifyJS中提取此类信息?

var uglify = require('uglify-js');
var code = "func(1/2, /hello/);";
var parsed = uglify.parse(code);
Run Code Online (Sandbox Code Playgroud)

我进入变量的结构parsed非常复杂.而我所需要的只是[{startIdx, endIdx}, {startIdx, endIdx}]每个字面正则表达式的数组.

PS如果有人认为可以通过比UglifyJS更好的方式完成同样的任务,欢迎提出建议!

UPDATE

我知道如果我深入研究解析后的结构,那么对于每个正则表达式我都可以找到对象:

AST_Token {
     raw: '/hello/',
     file: null,
     comments_before: [],
     nlb: false,
     endpos: 17,
     endcol: 17,
     endline: 1,
     pos: 10,
     col: 10,
     line: 1,
     value: /hello/,
     type: 'regexp'
}
Run Code Online (Sandbox Code Playgroud)

我需要弄清楚如何从解析的结构中提取所有这些对象,这样我就可以编译位置索引列表.

vit*_*y-t 1

我得到了UglifyJS 作者的博客文章的这个最终有用的链接,它为我指明了正确的方向。基于该博客,我能够将枚举代码修改为以下内容:

function enumRegEx(parsed) {
    var result = [];
    parsed.walk(new uglify.TreeWalker(function (obj) {
        if (obj instanceof uglify.AST_RegExp) {
            result.push({
                startIdx: obj.end.col,
                endIdx: obj.end.endcol
            });
        }
    }));
    return result;
}
Run Code Online (Sandbox Code Playgroud)

这个东西不仅更短并且工作原理相同,而且它的处理速度几乎是即时的,在 10ms 之内,这让之前的结果(430ms)相形见绌。

现在这就是我一直在寻找的结果!:)

更新:最后,我发现对于这个特定的任务,esprima是一个更好的选择。与 UglifyJS 不同,它速度更快,并且具有完整的 ES6 支持。

感谢Ariya Hidayat的大力支持,通过esprima完成了同样的任务:

function parseRegEx(originalCode) {
    var result = [];
    esprima.tokenize(originalCode, {loc: true, range: true}, function (obj) {
        if (obj.type === 'RegularExpression') {
            result.push({
                startIdx: obj.range[0],
                endIdx: obj.range[1]
            });
        }
    });
    return result;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,使用esprima,您甚至不需要解析代码,而是传入原始代码,esprima只会对其进行标记,这要快得多。