-1

我正在尝试匹配主要、次要、修订版和内部版本号。

我的问题是:

给定 2 个版本

string Version1 = "01.01.02.44";
string Version2 = "01.01.02.FF1";
string pattern =@"\d+.\d+.\d+.\d+";
var regEx = new Regex(pattern, RegexOptions.IgnoreCase);
var versionMatch = regEx.Match(Version2);
            if (match.Success)
            {
                 // DO ...
            }

使用以下正则表达式模式:

string pattern =@"\d+.\d+.\d+.\d+";

我可以匹配版本1...

但是我如何让它匹配 Version2 ?

4

5 回答 5

4

您需要检查版本号中有效的任何字符,而不仅仅是数字。例如,以下正则表达式将匹配两者:

string pattern =@"\d+\.\d+\.\d+\.[0-9F]+";

这与前三个部分都是纯数字的假设相匹配,而最后一个可以是任何数字或字母 F。您只需根据您的精确要求修改字符类(我们不知道)。

于 2012-11-09T13:11:44.150 回答
3

Why use string manipulations to handle version numbers ?

I recommend using the System.Version class.

That class already manages all parts of a version (Build, Major, MajorRevision, Minor, MinorRevision, Revision).

You can easily compare version numbers, not only for a match, but also to check if a version number is older or newer than another :

Version v1 = new Version(2, 0);
Version v2 = new Version("2.1");

Console.Write("Version {0} is ", v1);

switch(v1.CompareTo(v2))
{
   case 0:
      Console.Write("the same as");
      break;
   case 1:
      Console.Write("later than");
      break;
   case -1:
      Console.Write("earlier than");
      break;
}

Console.WriteLine(" Version {0}.", v2);  

Take a look at this MSDN article about System.Version for more details and examples.

That class will save you the overhead of handling the different parts of a version number yourself using string manipulations.

于 2012-11-09T13:17:02.490 回答
3

最简单的方法是拆分.

string[] parts = versionNumber.Split('.');
if (parts.Length != 4)
{
    // Invalid revision number.
}
else
{
    string major = parts[0];
    string minor = parts[1];
    string revision = parts[2];
    string buildNumber = parts[3];
    // etc...
}
于 2012-11-09T13:11:00.573 回答
0

要捕获您提到的两个字符串,您可以更改:

string pattern =@"\d+.\d+.\d+.\d+";

至:

string pattern =@"\d\d[.]\d\d[.]\d\d[.]...|\d\d[.]\d\d[.]\d\d[.]..";

了解一些关于正则表达式的工作原理并可能测试一些场景对您来说会很有好处。然后,您可以调整模式以匹配您的确切需求。

如果要在 yuor 模式中捕获点 (.),则必须将其括在方括号中,因为它用作保留字符。加号 (+) 表示任意数量的前面字符,因此 \d+ 将匹配任意数量的数字(01 和 0123 以及 567789 等)。

请参阅正则表达式备忘单

如果您想测试您的正则表达式,您可以在线进行。

于 2012-11-09T13:23:18.877 回答
0

那是因为您只寻找整数 0-9 而不是字母

您可以将刺痛分成多个组,使用 .*? 获取所有字符,而不是仅 [0-9]

 @"(?s)\.(?<string>.*?)\.(?<string>.*?)\.(?<string>.*?)\.(?<string>.*?)"
于 2012-11-09T13:09:38.443 回答