Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用正则表达式从AssemblyInfo.cs文件检索程序集版本_C#_.net_Regex_Match - Fatal编程技术网

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

C# 使用正则表达式从AssemblyInfo.cs文件检索程序集版本,c#,.net,regex,match,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{

在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
是从文件中读取的全文,并且
匹配.Groups[0]。AssemblyVersion中的值应为“1”

我的问题是用正则表达式逐个检索这些数字。


这个小工具用于在每次Visual Studio构建应用程序时增加应用程序版本,我知道有很多工具可以做到这一点。

第一组显示完全匹配。您的版本号在第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, ...)

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

System.Version(this.mContents);
此外,还可以通过以下函数调用获得System.Version:

Assembly.GetExecutingAssembly().GetName().Version;
还可以通过指定“*”自动设置版本号和修订号,如下所示:

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

我希望这能有所帮助。

您为什么必须使用regexp而不是:

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

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

private const string AssemblyVersionStart = @"\[assembly\: AssemblyVersion\(""(\d+\.\d+\.\d+\.\d+)""\)\]";
您可以通过解析组[1]获得版本,该组将包含类似“1.0.237.2927”的内容


是的,如果给定的字符串是
[assembly:AssemblyVersion(\'1.0.0\')
,则它将拆分为
[AssemblyVersion(\'1
0
0
0\”)
System.Version(this.mContents)
将引发异常,因为给定的字符串不包含有效格式和
Assembly.GetExecutionGassembly().GetName().Version
正在获取当前正在执行的程序集,但我想从AssemblyInfo.cs文件加载这些版本号是的,您的第一条语句是正确的。我也回去读了你最初的问题,但被误解了。
[assembly:AssemblyVersion(“1.0.*”)]
在您的情况下是否有效?John Weldon是对的。我建议使用测试正则表达式。当我需要每隔一个月测试一次正则表达式时,这对我来说是一个很大的帮助。
try{
    var match= Regex.Match(text, AssemblyVersionStart);
    var version = System.Version.Parse(match.Groups[1].Value);
    ...
}catch(...