鉴于以下情况:
string input = "xSxSx";
var result = Regex.Replace(input, "xSx", "xTx");
// result == "xTxSx"
看起来替换字符串没有用于进一步匹配,这就是我们没有得到预期的“xTxTx”的原因。
如何解决?是否有某种特殊符号告诉引擎使用第一个替换已经到位的字符串查找第二个匹配项?
那是因为,一旦匹配了一个字符,就不会再匹配了。所以,第二次匹配的字符串是Sx
而不是xSx
。
您需要在这里使用环视:
Regex.Replace(input, "(?<=x)S(?=x)", "T");
这将用替换前面和S
后面的。由于环视是0 长度的断言,它们不会消耗.x
T
x
只需将循环用于任何无法简化为前瞻/后视的更复杂的事情。
string test = "xSxSx";
string result = string.Empty;
while(true) {
result = Regex.Replace(test, "xSx", "xTx");
if(result != test)
test = result;
else
break;
}