Coincidencia de partes de números de versión con expresiones regulares
Pregunta
Estoy tratando de hacer coincidir las partes de un número de versión (Major.Minor.Build.Revision) con expresiones regulares de C #. Sin embargo, soy bastante nuevo en escribir Regex e incluso usar Expresso está resultando un poco difícil. En este momento, tengo esto:
(?<Major>\d*)\.(?<Minor>\d*)\.(?<Build>\d*)\.(?<Revision>\d*)
Esto funciona, pero requiere que exista cada parte del número de versión. Lo que me gustaría hacer también es hacer coincidir versiones como:
2.13
En este caso, los grupos de compilación y revisión deben devolver valores nulos. Siéntase libre de sugerir un mejor método si me equivoco al respecto.
Solución
(?<Major>\d*)\.(?<Minor>\d*)(\.(?<Build>\d*)(\.(?<Revision>\d*))?)?
Hace que la tercera y cuarta partes sean opcionales.
Otros consejos
Sé que esto no es una expresión regular, pero System.Version hace todo el trabajo por usted.
Probado en VBScript, este patrón:
^(\d+)(\.\d+)?(\.\d+)?(\.\d+)?$
Validará todo lo siguiente True:
- 23
- 23.1
- 23.1.1
- 23.1.1.1
Y lo siguiente todo falso:
- 23.11.11.33.11
- 23.43 2.1
- 44.11.2 3
- 3q.4.2.1
- 3.4.
- 4.3.21a
Si no desea utilizar Regex, puede probar:
System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(<string filePath>);
int major = fvi.FileMajorPart;
int minor = fvi.FileMinorPart;
int build = fvi.FileBuildPart;
La respuesta anterior no funciona correctamente
(?<Major>\d*)\.(?<Minor>\d*)(\.(?<Build>\d*)(\.(?<Revision>\d*))?)?
prueba este,
var regularExpression = @"^(\d+\.)?(\d+\.)?(\d+\.)?(\*|\d+)$";
var regex = Regex.IsMatch("1.0.0.0", regularExpression, RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
Console.WriteLine(regex);
Pruebe algo como esto:
(?<Major>\d*)\.?(?<Minor>\d*)?\.?(?<Build>\d*)?\.?(?<Revision>\d*)?
Simplemente agregué algunos & "; cero o uno &"; cuantificadores a los grupos de captura y también a los puntos en caso de que no estén allí.