2016-04-21 24 views
1

Ich versuche, eine bestimmte Zeichenfolge mit Regex zu ersetzen.Ersetzen mit Regex in einer Zeichenfolge Javascript

var replace = {'<RAndom>': "random object"}; 

Ich ersetze es mit dem dynamischen Regex, weil ich viele Objekte habe.

var tagsText = "<RAndom> hellow world"; 
var regex = new RegExp('\\b(' + Object.keys(replace).join('|') + ')\\b', 'g'); 
tagsText = tagsText.replace(regex, function(match) { 
    return replace[match] + match; 
}); 

Aber es ist nicht working.I denkt, das Problem mit dem Semikolon ist, aber ich bin nicht sure.The Ausgang ist wieder gleich.

"<RAndom> hellow world" 

Irgendwelche Ideen?

+1

Sie sollten die '\\ b's oder ersetzen durch' (^ | \\ W) 'und' (\\ W | $) 'respectively. –

Antwort

1

Die Wortgrenze \b und Nicht-Wortgrenze Behauptung Verhalten hängt vom Kontext ab. Machen Sie es kontextunabhängige mit eindeutigen (^|\W) und ($|\W):

var replace = {'<RAndom>': "random object"}; 
 
var tagsText = "<RAndom> hellow world"; 
 
var regex = new RegExp('(^|\\W)(' + Object.keys(replace).join('|') + ')(\\W|$)', 'g'); 
 
tagsText = tagsText.replace(regex, function(match, g1, g2, g3) { 
 
    return replace[g2] ? replace[g2] + match : match; 
 
}); 
 
// And just a demo below 
 
document.body.innerHTML = "<pre>" + tagsText.replace(/&/g, '&amp;') + "</pre>";

Die (^|\W) wird den Beginn der Zeichenfolge oder einem Nicht-Wortzeichen entsprechen. Die ($|\W) wird das Ende der Zeichenfolge oder ein Nicht-Wort-Zeichen übereinstimmen.

Da wir jetzt 3 Gruppen haben, können wir sie als Argumente an den Ersatz-Callback übergeben. Mit replace[g2] ? replace[g2] + match : match; überprüfen wir zuerst, ob es einen Wert für g2 Schlüssel gibt, und wenn ja, führen Sie den Austausch durch. Andernfalls geben Sie einfach die match zurück.

+1

Danke für die tolle Erklärung :) – soldiershin

2

Problem ist das Vorhandensein von \b (Wortgrenze) auf jeder Seite, die vor & und ; platziert ist. Sowohl & als auch ; sind keine Nicht-Wort-Zeichen, und \b kann nicht vor und nach Nicht-Wortzeichen aktiviert werden.

können Sie \B statt:

var regex = new RegExp('\\B(' + Object.keys(replace).join('|') + ')\\B', 'g'); 

und dann

tagsText = tagsText.replace(regex, function(match) { 
    return replace[match] + match; 
}); 

//=> "random object&lt;RAndom&gt; hellow world" 
+0

Wenn ein Schlüssel mit einem Wortzeichen beginnt oder endet, schlägt dies fehl. –

+0

In diesem Fall hätte OP's Code funktioniert. Ich denke mehr Details benötigt von OP über die Absicht hinter '\ b' und mehr Beispielen. – anubhava

+0

Oder verwenden Sie meine Lösung, die kontextunabhängig ist. Irgendwie :) –

Verwandte Themen