2012-04-09 6 views
18
string input = "Hello World!"; 
string pattern = "(World|Universe)"; 
string replacement = "$1"; 

string result = Regex.Replace(input, pattern, replacement); 

das folgende Beispiel in Erwägung, wäre das Ergebnis "Hello World!" sein, da die $1 mit der ersten Gruppe (World|Universe) ersetzt wird, aber das Ergebnis, das ich will, ist "Hello $1!"Handhabung regex Flucht Ersatztext, der das Dollar-Zeichen enthält

Die Regex.Escape Methode soll verwendet werden, um ein Regex-Muster, nicht die Ersetzung zu entkommen, da es andere Zeichen wie Schrägstriche und andere Regex-Muster-Zeichen entkommen kann. Die offensichtliche Lösung für mein Problem ist, meinen Ersatz gleich "$$1" zu haben, und werde "Hello $1!" erreichen, aber ich frage mich, ob das Dollarzeichen der einzige Wert ist, den ich entkommen muss (vorausgesetzt, replacement ist Benutzer generiert, und ich weiß es nicht voraus der Zeit), oder gibt es eine Hilfsfunktion, die dies bereits tut.

Kennt jemand eine Funktion, um den Ersatzwert zu umgehen, den Regex.Replace(string input, string pattern, string replacement) verwendet?

Antwort

16

Von MSDN:

Die Ersatz Parameter gibt die Zeichenfolge, die jedes Spiel in Eingang zu ersetzen ist. Ersetzung kann aus einer beliebigen Kombination von Literaltext und substitutions bestehen.

Die folgenden Substitutionen are defined:

  • $ number
  • $ {name}
  • $$
  • &
  • `$ $
  • ‚$
  • $ +
  • $ _

Auswechslungen sind die einzigen in einem Ersatzmuster erkannt spezielle Konstrukte. Keines der anderen Sprachelemente für reguläre Ausdrücke, einschließlich Zeichen-Escapes und dem Punkt (.), Der mit einem beliebigen Zeichen übereinstimmt, wird unterstützt. In ähnlicher Weise werden Elemente der Substitutionssprache nur in Ersatzmustern erkannt und sind in regulären Ausdrucksmustern niemals gültig.

Es sieht also so aus, als ob nur das $ -Zeichen maskiert werden muss.

+1

Auch von MSDN: Ersetzungen sind die einzigen regulären Sprachelemente, die in einem Ersatzmuster erkannt werden. Alle anderen Sprachelemente für reguläre Ausdrücke, einschließlich Zeichenausblendungen, sind nur in Mustern für reguläre Ausdrücke zulässig und werden in Ersatzmustern nicht erkannt. – Gebb

+0

Das sieht gut genug für mich aus, ich vermute, einen dummen alten Ersatz zu machen. Ersetzung ("$", "$$") sollte dann gut 100% der Zeit sein? – Matthew

+7

Ja, 'replacement.Replace (" $ "," $$ ")' sollte alles sein, was Sie brauchen. – dtb