Correspondance des parties de numéro de version avec des expressions régulières
Question
J'essaie de faire correspondre les parties d'un numéro de version (Major.Minor.Build.Revision) avec des expressions régulières C #. Cependant, je suis assez nouveau pour écrire Regex et même utiliser Expresso s’avère un peu difficile. En ce moment, j'ai ceci:
(?<Major>\d*)\.(?<Minor>\d*)\.(?<Build>\d*)\.(?<Revision>\d*)
Cela fonctionne, mais nécessite que chaque partie du numéro de version existe. Ce que je voudrais faire, c'est aussi faire correspondre les versions telles que:
2.13
Dans ce cas, les groupes de construction et de révision doivent renvoyer des valeurs nulles. N'hésitez pas à suggérer une meilleure méthode si je m'y prends mal.
La solution
(?<Major>\d*)\.(?<Minor>\d*)(\.(?<Build>\d*)(\.(?<Revision>\d*))?)?
Rend les troisième et quatrième parties facultatives.
Autres conseils
Je sais que ce n'est pas une regex, mais System.Version fait tout le travail pour vous.
Testé en VBScript, ce modèle:
^(\d+)(\.\d+)?(\.\d+)?(\.\d+)?$
Validera tous les vrais suivants:
- 23
- 23.1
- 23.1.1
- 23.1.1.1
Et tous les faux suivants:
- 23.11.11.33.11
- 23.43 2.1
- 44.11.2 3
- 3q.4.2.1
- 3.4.
- 4.3.21a
Si vous ne souhaitez pas utiliser Regex, vous pouvez essayer:
System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(<string filePath>);
int major = fvi.FileMajorPart;
int minor = fvi.FileMinorPart;
int build = fvi.FileBuildPart;
La réponse ci-dessus ne fonctionne pas correctement
(?<Major>\d*)\.(?<Minor>\d*)(\.(?<Build>\d*)(\.(?<Revision>\d*))?)?
essayez celui-ci,
var regularExpression = @"^(\d+\.)?(\d+\.)?(\d+\.)?(\*|\d+)$";
var regex = Regex.IsMatch("1.0.0.0", regularExpression, RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
Console.WriteLine(regex);
Essayez quelque chose comme ça:
(?<Major>\d*)\.?(?<Minor>\d*)?\.?(?<Build>\d*)?\.?(?<Revision>\d*)?
J'ai simplement ajouté des " zéro ou un " quantificateurs aux groupes de capture et aux points au cas où ils ne seraient pas là.