如何在使用Regex.Replace方法时找到子字符串?

时间:2014-12-28 11:57:34

标签: c# regex

我正在使用此代码通过索引替换字符串中所有找到的值:

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)"

3 个答案:

答案 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;,这是非常脆弱的