Я пытаюсь заставить замену 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
это хорошо работает. Что я должен поместить там для выхода из второй цифры, на самом деле не вставляя символ?
Используйте $ {1}
вместо $ 1
. Это также синтаксис подстановки для именованной группы захвата (?
.
Вот отрывок для иллюстрации ( см. Также на 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
интерпретируется как буквальная последовательность символов , которая используется для заменить каждое совпадение.Замена именованной группы
Элемент языка
$ {name}
заменяет последнюю подстроку, совпадающую с записью группыname
, гдеname
- это имя группы захвата, определенной элементом языка(?
.) Если
имя
не указывает допустимую именованную группу захвата, определенную в шаблоне регулярного выражения,$ {name}
интерпретируется как буквальная последовательность символов , которая используется для замены каждого совпадения.