2008-12-30 17 views
7

Estoy tratando de hacer coincidir las partes de un número de versión (Major.Minor.Build.Revision) con expresiones regulares C#. Sin embargo, soy bastante nuevo para escribir Regex e incluso el uso de Expresso está resultando un poco difícil. En este momento, tengo esto:Partes del número de versión coincidente con expresiones regulares

(?<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 es también coincide con versiones como:

2.13 

En este caso, los grupos de revisión y generación tienen que devolver valores nulos. Siéntase libre de sugerir un método mejor si todo esto va mal.

Respuesta

12
(?<Major>\d*)\.(?<Minor>\d*)(\.(?<Build>\d*)(\.(?<Revision>\d*))?)? 

Hace que las partes tercera y cuarta sean opcionales.

+0

Votado porque estaba a 3 segundos de hacer clic en la publicación con la misma respuesta :) –

+0

¡Gracias! En intentos anteriores, estaba encerrando a cada grupo en su propia expresión Cero o Más, en lugar de anidarlos. –

+0

@ sean.bright: gracias y mala suerte.Todavía hay un problema de armas más rápidas en el oeste, de algún tipo. : D –

-1

intentar algo como esto:

(?<Major>\d*)\.?(?<Minor>\d*)?\.?(?<Build>\d*)?\.?(?<Revision>\d*)?

simplemente he añadido algunos "cero o una" cuantificadores a los grupos de captura y también para los puntos en caso de que no están allí.

+0

Eso permite 2.13 .. como un número válido; también 2.13..13. –

+0

Aha - ¡tienes razón! ¡Buena atrapada! –

1

Si no desea utilizar expresiones regulares que podría intentar:

System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(<string filePath>); 

int major = fvi.FileMajorPart; 
int minor = fvi.FileMinorPart; 
int build = fvi.FileBuildPart; 
+0

Cuando funciona, muy limpio. –

+0

¿No hay posibilidad de obtener Revison? 'Ma.Mi.B.R' – Lucas

1

Probado en VBScript, este patrón:

^(\d+)(\.\d+)?(\.\d+)?(\.\d+)?$ 

validará todo lo siguiente es cierto:

  • 23.1
  • 23.1.1
  • 23.1.1.1

Y la 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
0

Por encima de respuesta no funciona correctamente

(?<Major>\d*)\.(?<Minor>\d*)(\.(?<Build>\d*)(\.(?<Revision>\d*))?)? 

probar esto,

var regularExpression = @"^(\d+\.)?(\d+\.)?(\d+\.)?(\*|\d+)$"; 
       var regex = Regex.IsMatch("1.0.0.0", regularExpression, RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); 
       Console.WriteLine(regex); 
3

Sé que esto no es una expresión regular, pero System.Version hace todo el trabajo para ti.

Cuestiones relacionadas