Regex замена захвата с последующей цифрой - PullRequest
25 голосов
/ 12 августа 2010

Я пытаюсь заставить работать замену 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 Ответ

39 голосов
/ 12 августа 2010

Используйте ${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>) языкЭлемент e.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...