RegExp 以类似 ES6 的格式去除变量

RegExp to strip a variable in ES6-like format

我正在使用语法为 ${varName} 的类似 ES6 的变量格式,在处理它们时,我尝试使用以下代码枚举所有指定的唯一变量:

function enumVars(txt) {
    var v, names = [];
    var reg = /$\{\s*[a-zA-Z$_][a-zA-Z0-9$_]*\s*}/g;
    while (v = reg.exec(txt)) {
        var svn = v[0].replace(/???/, ''); // stripped variable name;
        if (names.indexOf(svn) === -1) {
            names.push(svn);
        }
    }
    return names;
}

我无法找出正确的 RegExpexec 结果中删除变量名。

当我使用 v[0] 时,它会给我 ${varName} 字符串,我需要将它剥离成 varName,删除前导 ${,尾随 },以及变量周围 { } 内可能存在的所有空格。

变量应遵循javascript命名约定,即:

总而言之,我们可能有一个从 exec 编辑为 ${ _$abc12_$ } 的变量 return,我需要一个用于调用 replace 的正则表达式 return 只是 _$abc12_$.

感谢大家的帮助!

您的替换正则表达式可以是

/^$\{\s*|\s*}$/g

用英语表示“删除开头的 ${...,或结尾的 ...}

只抓取所有字符串并一次性转换它们,然后过滤掉重复项可能会稍微容易一些:

function enumVars(txt) {
    return txt

        // Find all matches of form ${var}
        . match(/$\{\s*[a-z$_][a-z0-9$_]*\s*}/gi)

        // Strip off ${ and }, yielding just variable name
        . map(function(v) { return v.replace( /^$\{\s*|\s*}$/g, ''); })

        // Filter out duplicates
        . filter(function(v, i, a) { return a.indexOf(v) === i; });
}