2010-12-02 9 views
5

名前の付いた2つのキャプチャグループ間の特定の位置にドル記号を挿入したいとします。問題は、置換文字列内のドル記号のすぐ後の2つの文字列が問題になることを意味します。C#dollar regex-replaceの問題

私はReplace-methodでどのように直接行うことができますか?一時的なゴミを追加して即座にもう一度取り除くことで回避策を見つけました。問題の

を参照してくださいコード:

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

答えて

12

使用この置換パターン:それはリテラル文字として扱われるように"${start}$$${end}"

ダブル$$$をエスケープします。第3の$は実際には名前付きグループ${end}の一部です。これについては、MSDN Substitutions pageでお読みください。

私は上記のアプローチに固執します。別の方法として、あなたはMatchEvaluatorを受け入れるReplaceオーバーロードを使用して何が必要連結、次のようなことができます。

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は、文字列からその情報を抽出する必要があります。容易に入手できません。 –

+0

アーマドが言ったように。私が与えた例は、置き換えの問題と実際の文字列を描くことに過ぎず、実際の文字列は単純な文章ではありません。 – user282727

+0

それは公正です。しかし、トークンを置き換えるだけでは、正規表現は過度であり、選択肢よりも遅いです。 (RegExは遅くはないが、通常の.Replace()の速度/単純さとは一致しない) –