Java регулярное выражение для обнаружения строк semver не работает без квалификаторов - PullRequest
1 голос
/ 01 октября 2019

Я пытаюсь получить метод Java, чтобы проверить, является ли аргумент String правильно отформатированной строкой версии " semver " (семантическое управление версиями).

В моемapp, строки semver должны иметь форму:

<major>.<minor>.<patch>-<qualifier>

Где:

  • <major> - положительное целое число (1 +)
  • <minor>и <patch> оба являются неотрицательными целыми числами (0 +)
  • <qualifier> является буквенно-цифровой строкой (([0-9][a-z][A-Z])+)

Допустимые примеры:

  • 1.2.40
  • 1.0.0-SNAPSHOT
  • 2.0.45-RC
  • 3.10.0

Моя лучшая попытка на данный момент:

public boolean isSemVer(String version) {
    Pattern versionPattern = Pattern.compile("^[a-zA-Z-]+\\d+\\.\\d+\\.\\d+");
    Matcher matcher = versionPattern.matcher(version);

    return matcher.matches();
}

Создает false для первого действительного примера 1.2.40. Может кто-нибудь сказать мне, где я ошибаюсь и что мне нужно настроить в моем регулярном выражении, чтобы оно приняло мои варианты использования? Заранее спасибо!

1 Ответ

2 голосов
/ 01 октября 2019

Ваши действительные строки начинаются с цифр, а не с букв, поэтому [a-zA-Z-]+ в вашем шаблоне уже делает шаблон неправильным.

Использование

^[1-9]\d*\.\d+\.\d+(?:-[a-zA-Z0-9]+)?$ 

См. Демонстрационную версию regex

Подробности

  • ^ - начало строки
  • [1-9]\d* - цифра от 1 до 9, а затем 0 или более цифр
  • \.\d+\.\d+ - два вхождения . и 1+ цифр (можно записать как (?:\.\d+){2})
  • (?:-[a-zA-Z0-9]+)? - необязательное вхождение- и 1+ буквенно-цифровых символов ([a-zA-Z0-9] можно записать как \p{Alnum})
  • $ - конец строки.

В Java используйте с .matches():

public boolean isSemVer(String version) {
    Pattern versionPattern = Pattern.compile("[1-9]\\d*\\.\\d+\\.\\d+(?:-[a-zA-Z0-9]+)?");
    Matcher matcher = versionPattern.matcher(version);
    return matcher.matches();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...