2015-04-04 59 views
0

我正在使用类似于ES6的变量格式与语法${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_$ }一个变量,我需要调用replace一个RegExp,将只返回_$abc12_$

感谢大家的帮助!

回答

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; }); 
} 
+0

这似乎工作,谢谢!至于英文,至少,没有跳过解释变量可以构成的部分,因为这确实会影响答案。 – 2015-04-04 03:40:56

+0

根据您的更改,我必须说我必须将'\}'更改为'}',并且替代'enumVars'不适用于我。首先,它没有'''关闭'map'调用,然后它发生 - 什么是uniq? :)除此之外,它看起来非常整齐,我只是钓鱼它工作:) – 2015-04-04 03:45:05

+0

我已经做了前面描述的变化,除了'uniq()'部分,它会引发错误。请将其改为工作。 – 2015-04-04 04:50:35