Matching Versão peças número com expressões regulares
Pergunta
Eu estou tentando corresponder as partes de um número de versão (Major.Minor.Build.Revision) com C # expressões regulares. No entanto, eu sou muito novo para escrever Regex e até mesmo usando Expresso está provando ser um pouco difícil. Agora, eu tenho este:
(?<Major>\d*)\.(?<Minor>\d*)\.(?<Build>\d*)\.(?<Revision>\d*)
Isso funciona, mas exige que cada parte do número de versão existe. O que eu gostaria de fazer é também corresponder versões como:
2.13
Neste caso, a compilação e grupos de revisão precisará retornar valores nulos. Sinta-se livre para sugerir um método melhor se eu vou sobre esta tudo errado.
Solução
(?<Major>\d*)\.(?<Minor>\d*)(\.(?<Build>\d*)(\.(?<Revision>\d*))?)?
faz a terceira e quarta partes opcionais.
Outras dicas
Eu sei que este não é um regex, mas System.Version faz todo o trabalho para você.
Testado em VBScript, este padrão:
^(\d+)(\.\d+)?(\.\d+)?(\.\d+)?$
irá validar todas as seguintes True:
- 23
- 23,1
- 23.1.1
- 23.1.1.1
E a seguir tudo falso:
- 23.11.11.33.11
- 23,43 2.1
- 44.11.2 3
- 3q.4.2.1
- 3.4.
- 4.3.21a
Se você não quiser usar Regex você poderia tentar:
System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(<string filePath>);
int major = fvi.FileMajorPart;
int minor = fvi.FileMinorPart;
int build = fvi.FileBuildPart;
Acima de resposta não está funcionando corretamente
(?<Major>\d*)\.(?<Minor>\d*)(\.(?<Build>\d*)(\.(?<Revision>\d*))?)?
Tente este,
var regularExpression = @"^(\d+\.)?(\d+\.)?(\d+\.)?(\*|\d+)$";
var regex = Regex.IsMatch("1.0.0.0", regularExpression, RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
Console.WriteLine(regex);
Tente algo parecido com isto:
(?<Major>\d*)\.?(?<Minor>\d*)?\.?(?<Build>\d*)?\.?(?<Revision>\d*)?
Eu simplesmente adicionados alguns quantificadores "zero ou um" para os grupos de captura e também para os pontos apenas no caso de eles não estão lá.