2012-01-04 9 views
0

私はC#で小さなおもちゃのコンパイラのようなものを書いていますが、私がしようとしているのはprintコマンドで、 '$'文字で始まるすべての部分文字列です$ foo)、適切な変数に置き換えます。 (基本的に '$'文字は変数名を示します)。C#regexは変数を置き換えて逃げます

これまで行ってきたことは、regexを使って '$'文字を含む部分文字列をすべて見つけることですが、replaceメソッドに問題があります。変数の格納方法は、FLEEエバリュエーター変数格納クラスを使用します。 (FLEEは高速軽量式評価プログラムである)、キーが変数名であり、値が変数値であるマップとして機能します。次のように

私のコードは次のとおりです。

 public void print(string exp) 
    { 
     this.expression = exp; 
     MatchEvaluator eval = new MatchEvaluator(this.matchEval); 
     MatchCollection coll = Regex.Matches(exp, @"(?<!\w)\$\w+"); 
     this.split = new string[coll.Count]; 
     int index = 0; 
     foreach (Match match in coll) 
     { 
      this.split[index] = match.ToString(); 
      index++; 
     } 
     this.i = 0; 
     Regex.Replace(exp, @"(?<!\w)\$\w+", eval); 
     Console.WriteLine(exp); 
     Console.ReadKey(); 
    } 

    private string matchEval(Match m) 
    { 
     this.split[this.i] = this.split[this.i].TrimStart('$'); 
     if(i != split.Length-1) 
      this.i++; 
     return this.split[this.i]; 
    } 

それはまだ正規表現は「$」文字を含めて一致して返すように、それはまだ変数を返しません。

ご協力いただければ幸いです。ありがとうございます。

+3

それはすべきではない:EXP = Regex.Replace(EXP、@ "?!(<\ w)は\ $ \ + W"、evalの); ? –

答えて

1

Marcel Valdez Orozcoが指摘しているように、この表現は問題ではありません。この問題は、Regex.Replace呼び出しによってStringが更新されることを期待しているが、代わりにRegex.Replaceが新しいStringインスタンスを返すことにあります。

ので、これを考慮に入れるために、あなたのコードを更新:

exp = Regex.Replace(exp, @"(?<!\w)\$\w+", eval); 
関連する問題