Сопоставление частей номера версии с регулярными выражениями
Вопрос
Я пытаюсь сопоставить части номера версии (Major.Minor.Build.Revision) с регулярными выражениями С#.Однако я новичок в написании Regex, и даже использование Expresso оказывается немного сложным.Прямо сейчас у меня есть это:
(?<Major>\d*)\.(?<Minor>\d*)\.(?<Build>\d*)\.(?<Revision>\d*)
Это работает, но требует, чтобы каждая часть номера версии существовала.Я хотел бы также сопоставить такие версии, как:
2.13
В этом случае группы «Сборка» и «Редакция» должны возвращать нулевые значения.Не стесняйтесь предлагать лучший метод, если я все делаю неправильно.
Решение
(?<Major>\d*)\.(?<Minor>\d*)(\.(?<Build>\d*)(\.(?<Revision>\d*))?)?
Делает третью и четвертую части необязательными.
Другие советы
Я знаю, что это не регулярное выражение, но Система.Версия делает всю работу за вас.
Протестировано в VBScript, этот шаблон:
^(\d+)(\.\d+)?(\.\d+)?(\.\d+)?$
Будет проверено все следующее: True:
- 23
- 23.1
- 23.1.1
- 23.1.1.1
И следующее все ложно:
- 23.11.11.33.11
- 23.43 2.1
- 44.11.2 3
- 3к.4.2.1
- 3.4.
- 4.3.21а
Если вы не хотите использовать Regex, вы можете попробовать:
System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(<string filePath>);
int major = fvi.FileMajorPart;
int minor = fvi.FileMinorPart;
int build = fvi.FileBuildPart;
Ответ выше не работает должным образом
(?<Major>\d*)\.(?<Minor>\d*)(\.(?<Build>\d*)(\.(?<Revision>\d*))?)?
Попробуй это,
var regularExpression = @"^(\d+\.)?(\d+\.)?(\d+\.)?(\*|\d+)$";
var regex = Regex.IsMatch("1.0.0.0", regularExpression, RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
Console.WriteLine(regex);
Попробуйте что-то вроде этого:
(?<Major>\d*)\.?(?<Minor>\d*)?\.?(?<Build>\d*)?\.?(?<Revision>\d*)?
Я просто добавил несколько квантификаторов «ноль или единица» к группам захвата, а также к точкам на тот случай, если их там нет.