0

我正在使用类似 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}字符串,我需要将它剥离成 just varName,删除前导${、尾随和可能驻留在变量周围的}所有空格。{ }

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

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

总之,我们可能有一个从execas返回的变量${ _$abc12_$ },我需要一个 RegExp 来调用replace它,它会返回 just _$abc12_$

感谢大家的帮助!

4

1 回答 1

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; });
}
于 2015-04-04T03:34:28.673 回答