Я ищу шаблон регулярного выражения, который будет соответствовать номеру версии.
Решения, которые я нашел здесь, на самом деле не соответствуют тому, что мне нужно.
Мне нужно, чтобы шаблон был действителен для одиночных чисел, а также для чисел, за которыми следует .
Допустимые числа
1
1.23
1.2.53.4
Недопустимые числа
01
1.02.3
.1.2
1.2.
-1
Это регулярное выражение должно помочь:
^(([1-9]+\d*\.)+[1-9]+\d*)|[1-9]+\d*$
Ниже объяснение.
[1-9]+\d*
означает последовательность, которая начинается с ненулевого числа, за которым следует ноль или более чисел
В первой части (([1-9]+\d*\.)+[1-9]+\d*)
собраны все ваши правильные примеры, кроме 1. Итак, у нас есть |
(или), за которым следует последовательность [1-9]+\d*
.
Но если я тестирую 01, он фиксирует 1, поэтому он становится действительным. То же самое для 1.2., он фиксирует 1.2.
Попробуйте использовать модификатор "A" ("Привязанный"). См. пример здесь: regex101.com/r/KK0eQT/1
Большое спасибо за это. Наконец, я хочу знать, можем ли мы обобщить, что правило 0number недействительно. Пример: 1.2.3.04
Рассмотреть возможность:
^[1-9]\d*(\.[1-9]\d*)*$
Разбивая это:
^
- Начать с начала строки.[1-9]
— Ровно один из символов с 1 по 9.\d*
- Больше цифр.(
- Начало некоторых дополнительных вещей\.
- Буквальная точка.[1-9]
— Ровно один из символов с 1 по 9.\d*
- Больше цифр.)
- Конец необязательных дополнительных материалов.*
- Может быть любое количество этих необязательных дополнительных материалов.$
- И закончить в конце строки.Остерегаться
Некоторые элементы этого синтаксиса различаются в зависимости от того, какой механизм регулярных выражений вы используете. Например, вы используете Perl, PHP, Javascript, C#, MySQL...?
По моему опыту, номера версий не соответствуют описанному вами аккуратному формату.
В частности, вы получаете такие значения, как 0.3RC5
, 12.0-beta6
, 2019.04.15-alpha4.5
, 3.1stable
, V6.8pl7
и другие.
Если вы проверяете существующие данные, убедитесь, что ваши критерии соответствуют описанным вами условиям. В частности, если вы следуете «Семантическому управлению версиями», имейте в виду, что версии, которые являются нулями, являются законными, поэтому 1.0.1, что «Дополнительные метки для метаданных предварительного выпуска и сборки доступны как расширения для формата MAJOR.MINOR.PATCH .", и что "1" не является допустимым номером версии.
Имейте в виду, что приведенное выше также будет соответствовать глупо длинным номерам версий, таким как 1.2.3.4.5.6.7.8.9.10.11.12.13.14
. Чтобы предотвратить это, вы можете ограничить его, например:
^[1-9]\d*(\.[1-9]\d*){0,3}$
Это изменяет *
для «любого количества необязательных дополнительных точек и цифр» на диапазон от нуля до трех. Так что он примет 1
, 1.2
, 1.2.3
и 1.2.3.4
, но не 1.2.3.4.5
.
Кроме того, если вы хотите, чтобы нули были допустимы, но только если нет других чисел (так что 0.3
, 1.0.1
), тогда это становится немного сложнее:
^(0|[1-9]\d*)(\.(0|[1-9]\d*)){0,3}$
Этот вопрос также может быть дубликатом: Регулярное выражение для разбора номера версии
Ты КОЗЕЛ. Я пришел сюда снова, чтобы спросить, что, если я хочу принять 1.0.1, но отказаться от 1.01.1, и обнаружил, что вы уже упомянули об этом в своем комментарии.
Какой механизм регулярных выражений вы используете? У меня работает, см.: regex101.com/r/bOpKER/1
Не обращайте внимания на мой удаленный комментарий. Я исправил это со своей стороны
([\*,\^])([\-,\*,\w]+[\.])+(\w)*
для пакета npm для примера
"cross-env": "^5.2.0",
Пожалуйста, найдите время, чтобы прочитать справка по редактированию в центр помощи. Форматирование на Stack Overflow отличается от форматирования на других сайтах.
Это не позволяет использовать версию исправления, такую как «5.2.0», она должна быть, например. "^5.2.0" или "~5.2.0"
0.1.2
:^([1-9]\d*|0)(\.(([1-9]\d*)|0)){2}$
1.1.5.0
или просто 1.2
:^([1-9]\d*|0)(\.(([1-9]\d*)|0)){0,3}$
|0
в первой группе:^([1-9]\d*)(\.(([1-9]\d*)|0)){0,3}$
1.0.0-beta
^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$
^
: соответствует началу строки$
: соответствует концу строки(
и )
: создайте группу([1-9]\d*|0)
: соответствует номеру версии
[1-9]\d*
: начиная с 1~9, после любого числа цифр|
: логический или0
: буквальный ноль\.
: буквальная (экранированная) точка{2}
: точные 2 совпадения{0,3}
: 0~3 совпаденияСоответствовать:
0.0.0
0.0.1
0.1.0
1.0.0
1.0.1
1.1.0
1.1.1
0.0.10
0.10.0
10.0.0
0.1.10
1.0.10
1.0.100
0.100.1
100.0.0
1.20.0
Не соответствует:
0.0.00
0.00.0
00.00.0
0.0.01
0.01.0
01.0.0
0.01.0
01.0.0
00.0.01
Обратите внимание на обновления моего ответа - есть ряд ошибок с форматами версий синтаксического анализа, которых вы, возможно, захотите остерегаться.