Шаблон регулярного выражения для соответствия допустимым номерам версий

Я ищу шаблон регулярного выражения, который будет соответствовать номеру версии.

Решения, которые я нашел здесь, на самом деле не соответствуют тому, что мне нужно.

Мне нужно, чтобы шаблон был действителен для одиночных чисел, а также для чисел, за которыми следует .

Допустимые числа

1
1.23
1.2.53.4

Недопустимые числа

01
1.02.3
.1.2
1.2.
-1

Обратите внимание на обновления моего ответа - есть ряд ошибок с форматами версий синтаксического анализа, которых вы, возможно, захотите остерегаться.

Dewi Morgan 09.04.2019 21:27
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
1
5 223
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Это регулярное выражение должно помочь:

^(([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.

Ziko 09.04.2019 18:33

Попробуйте использовать модификатор "A" ("Привязанный"). См. пример здесь: regex101.com/r/KK0eQT/1

Ildar Akhmetov 09.04.2019 18:42

Большое спасибо за это. Наконец, я хочу знать, можем ли мы обобщить, что правило 0number недействительно. Пример: 1.2.3.04

Ziko 09.04.2019 19:19
Ответ принят как подходящий

Рассмотреть возможность:

^[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, и обнаружил, что вы уже упомянули об этом в своем комментарии.

Ziko 10.04.2019 20:09

Какой механизм регулярных выражений вы используете? У меня работает, см.: regex101.com/r/bOpKER/1

Dewi Morgan 10.04.2019 22:10

Не обращайте внимания на мой удаленный комментарий. Я исправил это со своей стороны

Ziko 12.04.2019 16:17

([\*,\^])([\-,\*,\w]+[\.])+(\w)*

для пакета npm для примера

    "cross-env": "^5.2.0",

Пожалуйста, найдите время, чтобы прочитать справка по редактированию в центр помощи. Форматирование на Stack Overflow отличается от форматирования на других сайтах.

Dharman 28.08.2019 11:04

Это не позволяет использовать версию исправления, такую ​​​​как «5.2.0», она должна быть, например. "^5.2.0" или "~5.2.0"

dude 23.06.2020 09:13

Major.Minor.Patch — npm-версия вроде 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 совпадения

Тестовые примеры (регулярное выражение101 JavaScript):

Соответствовать:

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

Другие вопросы по теме