正则表达式替换捕获后跟数字

时间:2010-08-12 10:59:34

标签: .net regex

我正在尝试使用正则表达式替换来更新我的AssemblyInfo.cs文件,所以我有:

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

问题是version类似于"1.5.3.0",因此当评估替换时,它会看到"$11.5.3.0$3"并且可能正在寻找第11个被捕获的组,因为它正在出现用:

$11.5.3.0")]

如果在$1之后粘贴一个空格,它就能正常工作。如果没有实际插入角色,我需要放在哪里以逃避第二个数字?

1 个答案:

答案 0 :(得分:38)

使用${1}代替$1。这也是名为capturing group (?<name>)的替换语法。

这是一个用来说明(see also on 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

此行为已明确记录:

  

Regular Expression Language Elements - Substitutions

     

Substituting a Numbered Group

     

$number语言元素包含替换字符串中number捕获组匹配的最后一个子字符串,其中number是捕获组的索引。

     

如果number未指定正则表达式模式中定义的有效捕获组,则$number将被解释为用于替换每个匹配的文字字符序列

     

Substituting a Named Group

     

${name}语言元素替换name捕获组匹配的最后一个子字符串,其中name(?<name>)语言元素定义的捕获组的名称。

     

如果name未指定正则表达式模式中定义的有效命名捕获组,则${name}将被解释为用于替换每个匹配项的文字字符序列