2016-11-23 1 views
2

ich folgendes Problem habe bei dem Versuch, eine regulären Ausdruck Substitution auszuführen:Javascript regex von Spiel mit Objekteigenschaft Lookup ersetzen ist "undefined"

Hier ist mein String und Regex:

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') 

"Dies ist die Stadt der Stadt, in der Grafschaft der Grafschaft und der Staat des Staates"

Hier ist mein Kontextobjekt für meine Regex-Substitution:

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

„Das ist die Stadt nicht definiert, in der Grafschaft undefinierter und den Zustand undefiniert“ starken Text

Warum ist meine regex mit undefined andernfalls ersetzen? Ich folge MDN die Dokumentation für regex Substitution und passende hier: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#special-capturing-parentheses

Während dieses Problem debuggen, habe ich die folgenden, die, dass es hebt ein Problem sein könnte, wenn sie innerhalb eines regex ersetzen Methode die Eigenschaften eines Objekts zuzugreifen:

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

"Dies ist die Stadt in der Stadt, befindet sich in der Grafschaft Grafschaft und der Zustand der Zustand"

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

Dies ist die Stadt [object Object], befindet sich in der Grafschaft [object Object] und der Zustand des [object Object]

Kann mir jemand erklären?

+1

'Kontext [ '$ 1']' auf 'undefined' ausgewertet * vor * in die Funktion übergeben werden. Sie müssen eine Callback-Funktion verwenden, um dynamische Berechnungen basierend auf Übereinstimmungen durchzuführen. – Bergi

Antwort

2

context['$1']ist undefined; Es gibt keine Eigenschaft namens $1 auf Ihrem context Objekt.

Anstelle eines statischen Ersatzwerts können Sie eine Rückruffunktion als zweites Argument für String.prototype. replace(pattern, callback) bereitstellen. Die Rückruffunktion wird für jede Übereinstimmung aufgerufen ... empfängt den übereinstimmenden Text und alle Erfassungsgruppenwerte als Argumente. Sie können Ihre Verarbeitung basierend auf diesen Werten durchführen und kontextabhängig einen Ersatzwert zurückgeben.

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);