Regex replacement capture followed by digit
I am trying to get a Regex replacement working to update my AssemblyInfo.cs files, so I have:
Regex.Replace(
contents,
@"(\[assembly: Assembly(File)?Version\("").*(""\)\])",
"$1" + version + "$3"
);
The problem is that version
is something like "1.5.3.0"
, so that when the replacement is evaluated it is seeing "$11.5.3.0$3"
and is presumably looking for the eleventh captured group beca开发者_如何学JAVAuse it is coming out with:
$11.5.3.0")]
If is stick a space after the $1
it works fine. What do I need to put in there to escape the second digit without actually inserting the character?
Use ${1}
instead of $1
. This is also the substitution syntax for named capturing group (?<name>)
.
Here's a snippet to illustrate (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
This behavior is explicitly documented:
Regular Expression Language Elements - Substitutions
Substituting a Numbered Group
The
$number
language element includes the last substring matched by thenumber
capturing group in the replacement string, wherenumber
is the index of the capturing group.If
number
does not specify a valid capturing group defined in the regular expression pattern,$number
is interpreted as a literal character sequence that is used to replace each match.Substituting a Named Group
The
${name}
language element substitutes the last substring matched by thename
capturing group, wherename
is the name of a capturing group defined by the(?<name>)
language element.If
name
does not specify a valid named capturing group defined in the regular expression pattern,${name}
is interpreted as a literal character sequence that is used to replace each match.
精彩评论