通过Java regex提取semver版本字符串的段

问题描述 投票:0回答:1

Java 8在这里。我正在尝试解析semver(或至少是我喜欢的semver风格)字符串,并提取出其主要片段:

  • 主要版本号
  • 次要版本号
  • 补丁号
  • 限定符(RCSNAPSHOTRELEASE等)

这是我的代码:

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

我需要对我的正则表达式和/或使用Matcher API进行什么操作,以便提取:

  • 1作为主要号码
  • 0作为次要号码
  • 1作为补丁号
  • RC作为预选赛

有什么想法吗?

java regex semantic-versioning
1个回答
0
投票
注意:

    您不应该在字符串文字中转义m\m不是有效的字符串转义序列,并且代码不会编译
  • [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 demo,输出:

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

  • © www.soinside.com 2019 - 2024. All rights reserved.