2010-12-02 12 views
5

Ich möchte ein Dollarzeichen an einer bestimmten Position zwischen zwei genannten einfangenden Gruppen einfügen. Das Problem ist, dass dies zwei unmittelbar folgende Dollarzeichen im Ersetzungsstring bedeutet, was zu Problemen führt.C# -Dollar-Problem mit Regex-ersetzen

Wie kann ich das direkt mit der Replace-Methode machen? Ich habe nur einen Workaround gefunden, indem ich einen temporären Müll hinzugefügt habe, den ich sofort wieder entferne.

Siehe Code für das Problem:

 // We want to add a dollar sign before a number and use named groups for capturing; 
     // varying parts of the strings are in brackets [] 
     // [somebody] has [some-dollar-amount] in his [something] 

     string joeHas = "Joe has 500 in his wallet."; 
     string jackHas = "Jack has 500 in his pocket."; 
     string jimHas = "Jim has 740 in his bag."; 
     string jasonHas = "Jason has 900 in his car."; 

     Regex dollarInsertion = new Regex(@"(?<start>^.*? has)(?<end>\d+ in his .*?$)", RegexOptions.Multiline); 

     Console.WriteLine(joeHas); 
     Console.WriteLine(jackHas); 
     Console.WriteLine(jimHas); 
     Console.WriteLine(jasonHas); 
     Console.WriteLine("--------------------------"); 

     joeHas = dollarInsertion.Replace(joeHas, @"${start}$${end}"); 
     jackHas = dollarInsertion.Replace(jackHas, @"${start}$-${end}");   
     jimHas = dollarInsertion.Replace(jimHas, @"${start}\$${end}"); 
     jasonHas = dollarInsertion.Replace(jasonHas, @"${start}$kkkkkk----kkkk${end}").Replace("kkkkkk----kkkk", ""); 

     Console.WriteLine(joeHas); 
     Console.WriteLine(jackHas); 
     Console.WriteLine(jimHas); 
     Console.WriteLine(jasonHas); 




Output: 
Joe has 500 in his wallet. 
Jack has 500 in his pocket. 
Jim has 740 in his bag. 
Jason has 900 in his car. 
-------------------------- 
Joe has ${end} 
Jack has $-500 in his pocket. 
Jim has \${end} 
Jason has $900 in his car. 

Antwort

12

verwenden Ersetzungsmuster: "${start}$$${end}"

Das Doppel $$ entweicht die $ so dass es als literale Zeichen behandelt wird. Die dritte $ ist wirklich Teil der genannten Gruppe ${end}. Sie können darüber auf der MSDN Substitutions page lesen.

Ich würde mit dem obigen Ansatz bleiben. Alternativ können Sie die Replace Überlastung verwenden, die eine MatchEvaluator akzeptiert und verketten, was Sie brauchen, ähnlich der folgenden:

jackHas = dollarInsertion.Replace(jackHas, 
       m => m.Groups["start"].Value + "$" + m.Groups["end"].Value); 
2

Warum verwenden Sie Regex für diese in erster Linie?

string name = "Joe"; 
int amount = 500; 
string place = "car"; 

string output = string.Format("{0} has ${1} in his {2}",name,amount,place); 
+1

Vermutlich muss der OP, dass die Informationen aus dem String extrahieren. Es ist nicht ohne weiteres verfügbar. –

+0

Genau wie Ahmad sagte. Das Beispiel, das ich gab, bestand nur darin, sich das Ersatzproblem und die echten Strings vorzustellen, und der wirkliche Gebrauch davon ist nicht für einfache Sätze. – user282727

+0

Das ist fair. Wenn Sie nur Tokens ersetzen, ist Regex jedoch übertrieben und langsamer als Alternativen. (RegEx ist nicht langsam, aber es kann nicht mit der Geschwindigkeit/Einfachheit eines normalen .Replace()) übereinstimmen –