Parti del numero di versione corrispondenti con espressioni regolari
Domanda
Sto cercando di abbinare le parti di un numero di versione (Major.Minor.Build.Revision) con le espressioni regolari C #. Tuttavia, sono abbastanza nuovo nello scrivere Regex e persino usare Expresso si sta rivelando un po 'difficile. In questo momento, ho questo:
(?<Major>\d*)\.(?<Minor>\d*)\.(?<Build>\d*)\.(?<Revision>\d*)
Funziona, ma richiede l'esistenza di ogni parte del numero di versione. Quello che vorrei fare è anche abbinare versioni come:
2.13
In questo caso, i gruppi Build e Revision devono restituire valori null. Sentiti libero di suggerire un metodo migliore se sto sbagliando tutto.
Soluzione
(?<Major>\d*)\.(?<Minor>\d*)(\.(?<Build>\d*)(\.(?<Revision>\d*))?)?
Rende facoltative la terza e la quarta parte.
Altri suggerimenti
So che questo non è un regex, ma System.Version fa tutto il lavoro per te.
Testato in VBScript, questo modello:
^(\d+)(\.\d+)?(\.\d+)?(\.\d+)?$
Convaliderà tutto quanto segue True:
- 23
- 23.1
- 23.1.1
- 23.1.1.1
E quanto segue tutto False:
- 23.11.11.33.11
- 23.43 2.1
- 44.11.2 3
- 3q.4.2.1
- 3.4.
- 4.3.21a
Se non si desidera utilizzare Regex, è possibile provare:
System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(<string filePath>);
int major = fvi.FileMajorPart;
int minor = fvi.FileMinorPart;
int build = fvi.FileBuildPart;
La risposta sopra non funziona correttamente
(?<Major>\d*)\.(?<Minor>\d*)(\.(?<Build>\d*)(\.(?<Revision>\d*))?)?
prova questo
var regularExpression = @"^(\d+\.)?(\d+\.)?(\d+\.)?(\*|\d+)$";
var regex = Regex.IsMatch("1.0.0.0", regularExpression, RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
Console.WriteLine(regex);
Prova qualcosa del genere:
(?<Major>\d*)\.?(?<Minor>\d*)?\.?(?<Build>\d*)?\.?(?<Revision>\d*)?
Ho semplicemente aggiunto alcune " zero o una " quantificatori per i gruppi di acquisizione e anche per i punti nel caso in cui non siano presenti.