private string ConvertReplacement(string replacement)
{
StringBuilder result = new StringBuilder();
int[] group_numbers = regex.GetGroupNumbers();
int max_number = (group_numbers.Length > 0) ? group_numbers[group_numbers.Length - 1] : 0;
int i = 0;
while (i < replacement.Length)
{
if (IsDigitGroupReference(replacement, i) ||
IsParenthesizedGroupReference(replacement, i))
{
int add = 0;
i++;
if (replacement[i] == '{') { i++; add = 1; }
int number = replacement[i++] - '0';
if (i < replacement.Length && Char.IsDigit(replacement, i))
{
number = number * 10 + replacement[i];
i++;
}
// insert only existing group references (others replaced with empty string):
if (number <= max_number)
{
result.Append('$');
result.Append('{');
result.Append(number.ToString());
result.Append('}');
}
i += add;
}
else if (replacement[i] == '$')
{
// there is $ and it is not a substitution - duplicate it:
result.Append("$$");
i++;
}
else if (replacement[i] == '\\' && i + 1 < replacement.Length)
{
if (replacement[i + 1] == '\\')
{
// two backslashes, replace with one:
result.Append('\\');
i += 2;
}
else
{
// backslash + some character, skip two characters
result.Append(replacement, i, 2);
i += 2;
}
}
else
{
// no substitution, no backslash (or backslash at the end of string)
result.Append(replacement, i++, 1);
}
}
return result.ToString();
}