Я бы выразил формат как:
"1-3 разделенных точками компонента, каждый числовой, за исключением того, что последний может быть *"
В качестве регулярного выражения это:
^(\d+\.)?(\d+\.)?(\*|\d+)$
[Изменить, чтобы добавить: это решение является кратким способом проверки, но было отмечено, что извлечение значений требует дополнительной работы. Это вопрос вкуса, справиться ли с этим, усложнив регулярное выражение или обработав подходящие группы.
В моем решении группы захватывают символы "."
. С этим можно справиться, используя группы без захвата, как в ответе Айборли.
Кроме того, крайняя правая группа будет захватывать последний компонент, даже если в нем менее трех компонентов, и, например, двухкомпонентный ввод приводит к захвату первой и последней групп, а средняя не определена. Я думаю, что этим могут заниматься не жадные группы, где они поддерживаются.
Код Perl для решения обеих проблем после регулярного выражения может выглядеть примерно так:
@version = ();
@groups = ($1, $2, $3);
foreach (@groups) {
next if !defined;
s/\.//;
push @version, $_;
}
($major, $minor, $mod) = (@version, "*", "*");
Что на самом деле не короче, чем разделение на "."
]