C#正则表达式替换中的美元符号问题

6

我希望在两个命名捕获组之间的特定位置插入美元符号。问题是这意味着替换字符串中有两个紧接着的美元符号,这会导致问题。

我该如何直接使用Replace方法来实现?我只找到了通过添加一些临时垃圾并立即删除的解决方法。

请参见以下代码以了解问题:

      // 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.
2个回答

13
请使用此替换模式:"${start}$$${end}"。双倍的$$转义了$,使其被视为一个字面字符。第三个$实际上是命名组${end}的一部分。您可以在 MSDN 的 Substitutions page上了解更多信息。我建议您采用上述方法。或者您可以使用接受MatchEvaluatorReplace重载,并连接所需内容,类似于以下示例:
jackHas = dollarInsertion.Replace(jackHas,
              m => m.Groups["start"].Value + "$" + m.Groups["end"].Value);

2
你为什么要首选使用正则表达式来完成这项任务呢?
string name = "Joe";
int amount = 500;
string place = "car";

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

1
大概OP需要从字符串中提取这些信息,因为它们不是直接可用的。 - Ahmad Mageed
就像Ahmad所说的那样。我举的例子只是为了说明替换问题,而真正的字符串和实际使用并不仅限于简单的句子。 - user282727
这很公平。不过,如果你只是替换标记,正则表达式就有些杀鸡焉用牛刀了,并且比其他替代方案更慢。(正则表达式并不慢,但它无法匹配普通的.Replace()的速度和简单性) - 3Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接