我正在使用此代码通过索引替换字符串中所有找到的值:
int i = 0;
input = "FGS1=(B+A*10)+A*10+(C*10.5)";
Regex r = new Regex("([A-Z][A-Z\\d]*)");
bool f = false;
MatchEvaluator me = delegate(Match m)
{
f = true;
i++;
return "i" + i.ToString();
};
do { f = false; input = r.Replace(input, me); } while (f);
//expected result: input == "i1=(i2+i3*10)+i4*10+(i5*10.5)"
但是我必须以更复杂的方式做到这一点,因为我必须用已发现的价值做些什么。例如:
MatchEvaluator me = delegate(Match m)
{
foundValue = /*getting value*/;
if (foundValue = "A") i--;
f = true;
i++;
return "i" + i.ToString();
};
此代码的预期结果:"i1=(i2+i2*10)+i2*10+(i3*10.5)"
答案 0 :(得分:5)
您可以使用匹配对象中的Groups
集合来获取匹配的组。第一项是整个匹配,因此第一组的值位于索引1:
string foundValue = m.Groups[1].Value;
if (foundValue == "A") i--;
答案 1 :(得分:2)
猜测你需要实现一个变量赋值,在其中为每个变量分配ix(其中x是递增的数字),然后重用该值,如果它出现,我们可以编写以下代码来解决你的问题:
var identifiers = new Dictionary<string, string>();
int i = 0;
var input = "FGS1=(B+A*10)+A*10+(C*10.5)";
Regex r = new Regex("([A-Z][A-Z\\d]*)");
bool f = false;
MatchEvaluator me = delegate(Match m)
{
var variableName = m.ToString();
if(identifiers.ContainsKey(variableName)){
return identifiers[variableName];
}
else {
i++;
var newVariableName = "i" + i.ToString();
identifiers[variableName] = newVariableName;
return newVariableName;
}
};
input = r.Replace(input, me);
Console.WriteLine(input);
此代码应打印: I1 =(I2 + I3 * 10)+ I3 * 10 +(12-14 * 10.5)
答案 2 :(得分:1)
你的问题应该由Guffa回答,只想分享我的另一种解决方法,使用.NET Regex的更多功能(如果我理解你的问题):
int i = 1;
string input = "FGS1=(B+A*10)+A*10+(C*10.5)";
var lookUp = new Dictionary<string, string>();
var output = Regex.Replace(input,
"([A-Z][A-Z\\d]*)",
m => {
if(!lookUp.ContainsKey(m.Value))
{
lookUp[m.Value] = "i" + i++;
}
return lookUp[m.Value];
});
Console.WriteLine(output); //i1=(i2+i3*10)+i3*10+(i4*10.5)
我使用字典来跟踪重复的匹配
即使重复匹配与&#34; A&#34;不同,这也应该有效。在您的原始解决方案中,它专门检查&#34; A&#34;,这是非常脆弱的