Попробуйте решение для регулярных выражений - сначала этот метод берет строки source
и target
и выполняет замену регулярных выражений для первых, нацеливая первые числа после 'tcm', которые должны быть привязаны к началустрока.В MatchEvaluator
он снова выполняет то же регулярное выражение, но в строке target
.
static Regex rx = new Regex("(?<=^tcm:)[0-9]+", RegexOptions.Compiled);
public string ReplaceOneWith(string source, string target)
{
return rx.Replace(source, new MatchEvaluator((Match m) =>
{
var targetMatch = rx.Match(target);
if (targetMatch.Success)
return targetMatch.Value;
return m.Value; //don't replace if no match
}));
}
Обратите внимание, что замена не выполняется, если регулярное выражение не возвращает совпадение для целевой строки.
Теперь запустите этот тест (вероятно, необходимо скопировать вышеупомянутое в класс теста):
[TestMethod]
public void SO9973554()
{
Assert.AreEqual("tcm:10-426-8", ReplaceOneWith("tcm:7-426-8", "tcm:10-15-2"));
Assert.AreEqual("tcm:5-426-8", ReplaceOneWith("tcm:100-426-8", "tcm:5-15-2"));
Assert.AreEqual("tcm:100-426-8", ReplaceOneWith("tcm:10-426-8", "tcm:100-15-2"));
}