2015-04-04 58 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