使用Regex从AssemblyInfo.cs文件中检索程序集版本

时间:2011-02-25 23:31:50

标签: c# .net regex match

在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 个答案:

答案 0 :(得分: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, ...)

答案 1 :(得分:3)

System.Version类将为您执行此操作。只需将版本字符串传递给构造函数,如下所示:

System.Version(this.mContents);

此外,可以通过以下函数调用获得System.Version:

Assembly.GetExecutingAssembly().GetName().Version;

也可以通过指定'*'自动设置构建和修订号,如下所示:

[assembly: AssemblyVersion("1.0.*")]

我希望这会有所帮助。

答案 2 :(得分:2)

我偶然发现了同样的问题,但我认为稍微改变模式会更容易。

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

通过解析包含" 1.0.237.2927"等内容的组[1]获得版本。

try{
    var match= Regex.Match(text, AssemblyVersionStart);
    var version = System.Version.Parse(match.Groups[1].Value);
    ...
}catch(...

答案 3 :(得分:0)

是否有必要使用正则表达式而不是:

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