Я не совсем уверен, насколько сильно вы ожидаете, что шаблон (строка 'one') будет отличаться. Если он всегда будет выглядеть так, как вы его показали, возможно, вы могли бы просто заменить девятки на «#» и использовать .ToString (...).
В противном случае вам, возможно, придется сделать что-то вроде
string one = "(9?99) 999-9999";
string two = "2221239876";
StringBuilder sb = new StringBuilder();
int j = 0;
for (int i = 0; i < one.Length; i++)
{
switch (one[i])
{
case '9': sb.Append(two[j++]);
break;
case '?': /* Ignore */
break;
default:
sb.Append(one[i]);
break;
}
}
Очевидно, вам следует убедиться, что исключений IndexOutOfRange не возникнет, если одна из строк «длиннее» другой (то есть «одна» содержит больше девяток, чем длина «два» и т.