Pertanyaan C # masalah dolar dengan regex-replace


Saya ingin memasukkan tanda dolar pada posisi tertentu antara dua kelompok penangkap yang bernama. Masalahnya adalah ini berarti dua segera setelah tanda dolar dalam string pengganti yang menghasilkan masalah.

Bagaimana saya bisa melakukannya secara langsung dengan metode Ganti? Saya hanya menemukan solusi dengan menambahkan beberapa sampah sementara yang saya langsung hapus lagi.

Lihat kode untuk masalah:

      // 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.

5
2017-12-02 18:29


asal


Jawaban:


Gunakan pola penggantian ini: "${start}$$${end}"

Ganda $$ melarikan diri $ sehingga diperlakukan sebagai karakter literal. Ketiga $ benar-benar bagian dari grup bernama ${end}. Anda dapat membaca tentang ini di MSDN Halaman substitusi.

Saya akan tetap dengan pendekatan di atas. Bergantian Anda dapat menggunakan Replace membebani yang menerima a MatchEvaluator dan gabungkan apa yang Anda butuhkan, serupa dengan yang berikut:

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

12
2017-12-02 18:35



Mengapa Anda menggunakan regex untuk ini di tempat pertama?

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

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

2
2017-12-02 18:35