2014-12-28 54 views
4

我使用這個代碼通過索引來替換字符串中的所有找到的值:如何使用Regex.Replace方法獲取找到的子字符串?

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

回答

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 +(6-14 * 10.5)

+1

謝謝!這正是我所需要的。 – InfernumDeus

5

可以使用Groups集合中的匹配對象,以獲得匹配組。第一項是整個匹配,所以從第一組的值是在索引1:

string foundValue = m.Groups[1].Value; 
if (foundValue == "A") i--; 
+1

由於某種原因,我的代碼循環這個,但更多看起來像它本來是錯的。 – InfernumDeus

1

您的問題應該由Guffa alrea回答DY,只是想分享我的另一種方式來解決你的問題,從使用正則表達式.NET功能更(如果我正確理解您的問題):

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) 

我用字典來跟蹤哪些重複

匹配

即使您的重複匹配不同於「A」,這也應該起作用。在你原來的解決方案中,它特別檢查「A」,這是相當脆弱的

+1

看起來不錯。但看起來像以前的答案完全一樣,但對我來說有點更明顯。如果我有更多時間來正確理解.NET,這種方式會更好。不管怎樣,謝謝你。 – InfernumDeus

相關問題