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

正则表达式替换的C#美元问题,c#,.net,regex,C#,.net,Regex,我想在两个命名的捕获组之间的特定位置插入一个美元符号。问题是,这意味着替换字符串中紧跟着两个美元符号,这会导致问题 如何使用替换方法直接实现这一点?我只是通过添加一些临时垃圾找到了一个解决办法,我会立即再次删除这些垃圾。 请参阅问题代码: // We want to add a dollar sign before a number and use named groups for capturing; // varying parts of the strings ar

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

如何使用替换方法直接实现这一点?我只是通过添加一些临时垃圾找到了一个解决办法,我会立即再次删除这些垃圾。

请参阅问题代码:

      // 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.
//我们想在数字前添加一个美元符号,并使用命名组进行捕获;
//字符串的不同部分在括号中[]
//[某人]的[某物]里有[一些美元]
string joeHas=“乔的钱包里有500英镑。”;
string jackHas=“杰克口袋里有500个。”;
string jimHas=“吉姆的包里有740个。”;
string jasonHas=“Jason的车里有900个。”;
Regex dollaring=new Regex(@“(?^.*?has)(?\d+在他的.*?$)”,RegexOptions.Multiline);
控制台写入线(joeHas);
控制台写入线(jackHas);
控制台写入线(jimHas);
控制台写入线(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}$kkkkk----kkkk${end}”).Replace(“kkkkkk----kkkk,”);
控制台写入线(joeHas);
控制台写入线(jackHas);
控制台写入线(jimHas);
控制台写入线(jasonHas);
输出:
乔的钱包里有500英镑。
杰克口袋里有500英镑。
吉姆的包里有740英镑。
杰森的车里有900英镑。
--------------------------
乔有${end}
杰克口袋里有-500美元。
吉姆有\${end}
杰森的车里有900美元。

首先,为什么要使用正则表达式

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

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

使用此替换模式:
“${start}$$${end}”

双精度
$$
将转义
$
,以便将其视为文字字符。第三个
$
实际上是命名组
${end}
的一部分。你可以在MSDN上看到这一点

我将坚持上述方法。或者,您可以使用
Replace
重载来接受
MatchEvaluator
并连接所需内容,类似于以下内容:

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

大概OP需要从字符串中提取该信息。正如艾哈迈德所说,这是不容易得到的。我举的例子只是为了描述替换问题和真正的字符串,它的真正用途不是简单的句子,这是公平的。不过,如果您只是更换代币,那么regex就太过分了,而且比其他代币慢。(RegEx并不慢,但它的速度/简单性不如普通的.Replace()