2013-08-05 126 views
3

考虑以下几点:C#Regex.Replace - 搜索替换字符串匹配以及

string input = "xSxSx"; 

var result = Regex.Replace(input, "xSx", "xTx"); 
// result == "xTxSx" 

它看起来像替换字符串不用于进一步的匹配,这就是为什么我们没有得到预期的“xTxTx”。

如何解决?是否有某种特殊符号可以让发动机在第一次替换时使用该字符串进行第二次匹配?

+1

您可能不希望这是默认行为,因为'Regex.Replace(input,“a”,“aa”)'会产生无限循环。 –

+0

是的,你是对的。 –

回答

5

这是因为,一旦一个字符匹配,它将不会再次匹配。所以,第二次匹配的字符串是Sx而不是xSx

您需要使用查找变通这里:

Regex.Replace(input, "(?<=x)S(?=x)", "T"); 

这将替换S这既是之前成功通过xT。由于的浏览环节0长度断言,他们不会消耗x

0

只需使用一个循环来处理更复杂的任何事情,而无法简化为[前/后]的外观。

string test = "xSxSx"; 
    string result = string.Empty; 
    while(true) { 
     result = Regex.Replace(test, "xSx", "xTx"); 
     if(result != test) 
      test = result; 
     else 
      break; 
    }