所以我在C#中写了一个小玩具编译器,我想要做的是在print命令中,对于以'$'字符开头的每个子字符串(例如 - $ foo),替换它用适当的变量。 (基本上,'$'字符表示变量名称。)
到目前为止我所做的是使用正则表达式查找包含'$'字符的所有子字符串,但是我遇到了替换方法的问题。如何存储变量是通过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];
}
它还没有返回变量,因为它仍然返回包含'$'字符的正则表达式匹配。
任何帮助都会非常感谢,谢谢。
答案 0 :(得分:1)
正如Marcel Valdez Orozco指出的那样,表达方式并非如此。问题在于您希望通过Regex.Replace调用更新String,而是Regex.Replace返回一个新的String实例。
因此请更新您的代码以将此考虑在内:
exp = Regex.Replace(exp, @"(?<!\w)\$\w+", eval);