使用正则表达式从AssemblyInfo.cs文件中检索程序集版本

6
在AssemblyInfo.cs文件中有这样一个字符串:[assembly: AssemblyVersion("1.0.0.1")]。我正在尝试逐个提取其中的数字,每个数字都是以下结构中的一个变量。
static struct Version
{
  public static int Major, Minor, Build, Revision;
}

我正在使用这个模式来尝试获取数字:
string VersionPattern = @"\[assembly\: AssemblyVersion\(""(\d{1,})\.(\d{1,})\.(\d{1,})\.(\d{1,})""\)\]";

然而,当我使用这段代码时,结果并不如预期,相反它显示了完整的字符串,就好像它是真正匹配而不是每个组中的数字。
Match match = new Regex(VersionPattern).Match(this.mContents);
if (match.Success)
{
  bool success = int.TryParse(match.Groups[0].Value,Version.Major);
  ...
}

在这种情况下,this.mContents 是从文件中读取的整个文本,match.Groups[0].Value 应该是 AssemblyVersion 中的 "1"。 我的问题是如何使用正则表达式逐个检索这些数字。 这个小工具是为了在 Visual Studio 每次构建应用程序时增加应用程序版本号,我知道有很多工具可以做到这一点。
4个回答

3
第一组显示完整匹配。您的版本号位于第1-4组中:
int.TryParse(match.Groups[1].Value, ...)
int.TryParse(match.Groups[2].Value, ...)
int.TryParse(match.Groups[3].Value, ...)
int.TryParse(match.Groups[4].Value, ...)

John Weldon 是正确的。我建议使用 Expresso 来测试你的正则表达式。当我偶尔需要测试正则表达式时,它对我非常有帮助。 - bigfoot

3

System.Version类可以帮助你完成这个任务。只需要将版本字符串传递给构造函数即可,如下所示:

System.Version(this.mContents);

此外,可以通过以下函数调用获取System.Version:
Assembly.GetExecutingAssembly().GetName().Version;

构建号和修订号也可以通过在下面示例中指定“*”来自动设置:
[assembly: AssemblyVersion("1.0.*")]

我希望这可以帮到您。

System.Version(this.mContents);会抛出异常,因为给定的字符串不包含有效的格式,而Assembly.GetExecutingAssembly().GetName().Version;获取的是当前正在执行的程序集,但我想从AssemblyInfo.cs文件中加载这些版本号。 - user635022
1
是的,你的第一句话是正确的。我也回去看了你最初的问题并且误解了。[assembly: AssemblyVersion("1.0.*")] 在你的情况下会起作用吗? - Gerry

3

我遇到了同样的问题,但我认为稍微改变一下模式会更容易。

private const string AssemblyVersionStart = @"\[assembly\: AssemblyVersion\(""(\d+\.\d+\.\d+\.\d+)""\)\]";

你可以通过解析Groups[1]来获得版本号,它会包含类似于“1.0.237.2927”的内容。
try{
    var match= Regex.Match(text, AssemblyVersionStart);
    var version = System.Version.Parse(match.Groups[1].Value);
    ...
}catch(...

0

你必须使用正则表达式而不是其他方法吗?这有什么原因吗?

string[] component = this.mContents.Split('.');
bool success = int.TryParse(component[0], out Version.Major);
...

是的,如果给定的字符串是 [assembly: AssemblyVersion(\"1.0.0.0\")],那么它将被分割成 [assembly: AssemblyVersion(\"1, 0, 00\")] - user635022

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接