Подтвердить что ты не робот

Захват замены регулярного выражения, за которым следует цифра

Я пытаюсь получить замену Regex для обновления файлов AssemblyInfo.cs, поэтому у меня есть:

Regex.Replace(
    contents, 
    @"(\[assembly: Assembly(File)?Version\("").*(""\)\])", 
    "$1" + version + "$3"
);

Проблема в том, что version - это что-то вроде "1.5.3.0", так что, когда оценка оценивается, она видит "$11.5.3.0$3" и, по-видимому, ищет одиннадцатую захваченную группу, потому что она выходит с:

$11.5.3.0")]

Если это пробел после $1, он работает нормально. Что мне нужно сделать, чтобы избежать второй цифры без фактического ввода символа?

4b9b3361

Ответ 1

Используйте ${1} вместо $1. Это также синтаксис подстановки для группы (?<name>).

Вот фрагмент, который можно проиллюстрировать (см. также на ideone.com):

Console.WriteLine(Regex.Replace("abc", "(.)", "$11"));        // $11$11$11
Console.WriteLine(Regex.Replace("abc", "(.)", "${1}1"));      // a1b1c1
Console.WriteLine(Regex.Replace("abc", "(?<x>.)", "${x}1"));  // a1b1c1

Это поведение явно документировано:

Элементы языка регулярного выражения - Замены

Подстановка нумерованной группы

Элемент языка $number включает в себя последнюю подстроку, согласованную группой захвата number в заменяющей строке, где number - индекс группы захвата.

Если number не указывает допустимую группу захвата, определенную в шаблоне регулярного выражения, $number интерпретируется как буквальная последовательность символов, которая используется для замены каждого соответствия.

Подстановка именной группы

Языковой элемент ${name} заменяет последнюю подстроку, согласованную группой захвата name, где name - это имя группы захвата, определенной элементом языка (?<name>).

Если name не указывает допустимую группу захвата именования, определенную в шаблоне регулярного выражения, ${name} интерпретируется как буквальная последовательность символов, которая используется для замены каждого соответствия.