Извлечение сегментов из полуверсионной строки через регулярное выражение Java - PullRequest
1 голос
/ 18 октября 2019

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

  • Основной номер версии
  • Minorномер версии
  • Номер исправления
  • Квалификатор (RC, SNAPSHOT, RELEASE и т. д.)

Вот мой код:

String version = "1.0.1-RC";
Pattern versionPattern = Pattern.compile("^[1-9]\\d*\\.\\d+\\.\\d+(?:-[a-zA-Z0-9]+)?$");
Matcher matcher = versionPattern.matcher(version);

if (matcher.matches()) {

    System.out.println("\n\n\matching version is: " + matcher.group(0));
    System.out.println("\nmajor #: " + matcher.group(1));
    System.out.println("\nminor #: " + matcher.group(2));
    System.out.println("\npatch #: " + matcher.group(3));
    System.out.println("\nqualifier: " + matcher.group(4) + "\n\n\n");

}

При этом я получаю следующий вывод на консоль:

matching version is: 1.0.1-RC
2019-10-18 14:32:05,952 [main] 84b37cef-70f9-4ab8-bafb-005821699766 ERROR c.s.f.s.listeners.StartupListener - java.lang.IndexOutOfBoundsException: No group 1

Что мне нужно сделать с моим регулярным выражением и / или нашим использованием API Matcher, чтобы я мог извлечь:

  • 1 в качестве основного номера
  • 0 в качестве младшего номера
  • 1 в качестве номера патча
  • RC как классификатор

Есть идеи?

1 Ответ

1 голос
/ 19 октября 2019

ПРИМЕЧАНИЕ:

  • Вы не должны экранировать m в строковом литерале, \m не является допустимой escape-последовательностью строки, и код не будет компилироваться
  • Matcher#matches() требует полного совпадения строк, не нужно добавлять ^ и $ якоря
  • Чтобы иметь возможность ссылаться на Matcher#group(n), вам необходимо определить группы в шаблоне в первую очередь. Оберните нужные детали парами неэкранированных скобок.

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

String version = "1.0.1-RC";
Pattern versionPattern = Pattern.compile("([1-9]\\d*)\\.(\\d+)\\.(\\d+)(?:-([a-zA-Z0-9]+))?");
Matcher matcher = versionPattern.matcher(version);

if (matcher.matches()) {
    System.out.println("matching version is: " + matcher.group(0));
    System.out.println("major #: " + matcher.group(1));
    System.out.println("minor #: " + matcher.group(2));
    System.out.println("patch #: " + matcher.group(3));
    System.out.println("qualifier: " + matcher.group(4) + "\n\n\n");
}

См. Java-демонстрацию , вывод:

matching version is: 1.0.1-RC
major #: 1
minor #: 0
patch #: 1
qualifier: RC
...