2014-03-25 47 views
-1

我試圖分裂像這樣的字符串:「ABCDE $ {}變量ZZZ」分割字符串,並保持deliminter

我想拆分字符串,所以我可以用一個值替換變量。我事先不知道變量名是什麼,所以我試圖避免使用「替換」。

+0

,什麼是使用'replace',請問避免的呢? – raina77ow

+0

@Raina,我想首先檢查字符串中指定的變量是否真的先存在。該字符串來自配置文件。 – user994165

回答

2

這是相當瑣碎當你真正與一些預定義的對象(包含所有數據)的財產處理。例如:

var data = { 
    foo: 'FOOFOO', 
    bar: 'BARBAR' 
}; 
var tplFoo = "abcde${foo}fghz"; 
var tplBar = "abcde${bar}fghz"; 
var tplBaz = "abcde${baz}fghz"; 
[tplFoo, tplBar, tplBaz].forEach(function(tpl) { 
    console.log(
    tpl.replace(/\$\{([^}]+)}/g, function(match, gr) { 
     return gr in data ? data[gr] : match; 
    }) 
); 
}); 

// ... this gives you: 
// abcdeFOOFOOfghz 
// abcdeBARBARfghz 
// abcde${baz}fghz 

這或多或少是模板功能的工作原理。你可以用全局變量做同樣的技巧(因爲它們可以通過全局對象訪問)。例如:

// on the global level 
var foo = 'FOOFOO'; 
var bar = 'BARBAR'; 
... 
tpl.replace(/\$\{([^}]+)}/g, function(match, gr) { 
    return gr in window ? window[gr] : match; 
}) 

與當地人做它甚至可以,但你必須在這裏使用eval

...其中,即使在這種簡單的情況下,可能導致非常不需要的後果。

0

是這樣的嗎?

var str = "abcde${variable}zzz" 
var key = str.match(/\$\{.*\}/g); 
var listOfelements = str.split(key[0]); 

如果你有一個以上的變量,你可能需要做一些額外的

0
var config = { 
    'foo': 'abc' 
}; 

var str = 'foo: ${foo} bar: ${bar}'; 

var matches = str.match(/(\$\{\w+\})/g); 

if(matches !== null) { 
    for(var i=0,l=matches.length;i<l;i++) { 
     var token = matches[i]; 
     var tvar = token.substr(2,token.length-3); 

     if(tvar in config) { 
      str = str.replace(token,config[tvar]); 
     } 
     else { 
      str = str.replace(token,'null'); 
     } 
    } 
} 

console.log(str); 
+0

爲什麼首先用'match'來比較字符串,當你最終還是'replace'時,我想知道?這一切都可以用一種方法完成,爲'replace'函數提供回調參數。 – raina77ow

+0

我已經說清楚了,以便他在做替換之前可以用結果做事。顯然這種方法比較原始。 –

0

這是你在找什麼?

var x = "abcde${variable}zzz"; 
alert(x.replace(/{.*}/, 'new_word')); 

或者,如果你想讓它與指數做我發現自己SO答案..這裏是link