正则表达式替换assemblyversion的最后两位数

时间:2016-11-21 19:24:52

标签: c# regex teamcity

我正在使用teamcity和C#项目,我想使用文件内容修补程序替换assemblyversion中的最后两位数字(例如:[assembly: AssemblyVersion("1.0.*.*")]中的两颗星)。我在文件内容修补程序上找到了文档,并建议使用 (^\s*\[\s*assembly\s*:\s*((System\s*\.)?\s*Reflection\s*\.)?\s*AssemblyVersion(Attribute)?\s*\(\s*@?\")(([0-9\*]+\.)+)[0-9\*]+(\"\s*\)\s*\])如果您只想更改最后的数字,这让我在那里。

我想如果我做(^\s*\[\s*assembly\s*:\s*((System\s*\.)?\s*Reflection\s*\.)?\s*AssemblyVersion(Attribute)?\s*\(\s*@?\")(([0-9\*]+(\.))+)[0-9\*]+(\"\s*\)\s*\])它会抓住最后一个时期作为它自己的组,让我替换这两个星没有问题。然而,看起来第一颗恒星仍然在1.0中被捕获(因此该组变为1.0。*。)。

我想要的是限制第一组捕获{major}。{minor}。然后让最后一个时期成为它自己的小组,这样我就可以做一些事情:$1$5\%build.number%$7%build.vcs.number%$8这会给我AssemblyVersion("1.0.{build#}.{vcs#}")]

一般来说,我可以在没有太多问题的情况下偶然发现正则表达式,但我在过去的几个小时里一直在研究这个问题,而我似乎无法理解它。有关达成这一结论的任何信息,他都会表示赞赏。

2 个答案:

答案 0 :(得分:2)

如果你想在验证的同时继续使用你发现要替换的解决方案,你可以使用

(^\s*\[\s*assembly\s*:\s*((System\s*\.)?\s*Reflection\s*\.)?‌​\s*AssemblyVersion(A‌​ttribute)?\s*\(\s*@?‌​\")([0-9\*]+\.[0-9\*‌​]+)\.([0-9\*]+\.[0-9‌​\*]+)(\"\s*\)\s*\])

并替换为$1$5.%build.number%.%build.vcs.number%$7

请参阅regex demo

我刚刚将([0-9\*]+(\.))+展开到([0-9\*]+\.[0-9\*‌​]+)\.([0-9\*]+\.[0-9‌​\*]+),用文字点(([0-9\*]+\.[0-9\*‌​]+))分隔的2个组(\.)。我还必须删除[0-9\*]+模式后面的([0-9\*]+(\.))+

答案 1 :(得分:1)

我首先提取1.0.*.*,然后使用Version.Parse

更小的正则表达式(并且可以缩短更多)..

string input = @"[assembly:AssemblyVersion(""1.2.3.4"")]";
var verStr = Regex.Match(input, @"\[.+?\(\""(.+?)\""\)\]").Groups[1].Value;
var version = Version.Parse(verStr);