2016-11-23 53 views
2

我有以下問題,而試圖執行一個正則表達式替換:的Javascript正則表達式替換爲「未定義」

這裏是我的字符串和正則表達式:

var content = "This is the city of {{city}}, located in the county of {{county}} and the state of {{state}}" 
content.replace(/\{\{([a-zA-Z0-9]*)\}\}/g, '$1') 

「這是城市的城市,位於縣和州的州``

這是我的上下文對象爲我的正則表達式替換:

var context = {city: "Abanda", county: "Chambers County", state: "Alabama"} 
content.replace(/\{\{([a-zA-Z0-9]*)\}\}/g, context['$1']) 

「這是一個城市的不確定,位於未定義縣和不確定的狀態」烈文

爲什麼我的正則表達式替換undefined失敗?我下面MDN的文檔的正則表達式替換和匹配在這裏:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#special-capturing-parentheses

在調試這個問題,我得到了下面,這強調了訪問正則表達式的方法中替換對象的屬性時,有可能是一個問題:

content.replace(/\{\{([a-zA-Z0-9]*)\}\}/g, '$1') 

「這是一個城市的城市,位於該縣的縣和州的狀態」

content.replace(/\{\{([a-zA-Z0-9]*)\}\}/g, context) 

這是城市的[目標對象],位於[目標對象]縣,[對象的對象]的狀態

任何人都可以解釋一下嗎?

+1

'上下文[ '$ 1']'被評估以'undefined' *之前*被傳遞給函數。您需要使用回調函數根據匹配進行動態計算。 – Bergi

回答

2

context['$1'] undefined; context對象上沒有名爲$1的屬性。

您可以提供回調函數作爲String.prototype. replace(pattern, callback)的第二個參數,而不是靜態替換值。 將針對每個匹配調用回調函數...接收匹配的文本和任何捕獲組值作爲參數。您可以根據這些值進行處理,並根據情況返回替換值。

var content = "This is the city of {{city}}, located in the county of {{county}} and the state of {{state}}"; 
 

 
var context = { 
 
    city: "Abanda", 
 
    county: "Chambers County", 
 
    state: "Alabama" 
 
}; 
 

 
var output = content.replace(/\{\{([a-z0-9]+)\}\}/gi, (match, key) => context[key]); 
 

 
console.log(output);