RegEx以类似ES6的格式剥离变量

时间:2015-04-04 03:12:52

标签: javascript regex regexp-replace

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

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;
}

我还没有找到正确的RegExp来从exec结果中删除变量名。

当我使用v[0]时,它会向我提供${varName}字符串,我需要将其删除为varName,删除前导${,尾随} ,以及可能位于变量周围{ }内的所有空格。

该变量应遵循javascript命名约定,这意味着:

  • 有效变量以字母,下划线或' $'开头。符号,后跟字母,数字,下划线或' $';
  • 的任意组合
  • 变量周围的前导和尾随空格将被忽略。

总之,我们可能会将exec作为${ _$abc12_$ }返回一个变量,我需要一个RegExp来调用只返回replace的{​​{1}}。

感谢大家的帮助!

1 个答案:

答案 0 :(得分:1)

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

/^\$\{\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; });
}