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.
Vermutlich muss der OP, dass die Informationen aus dem String extrahieren. Es ist nicht ohne weiteres verfügbar. –
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
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 –