通过 Java 正则表达式提取 semver 版本字符串的片段

Posted

技术标签:

【中文标题】通过 Java 正则表达式提取 semver 版本字符串的片段【英文标题】:Extracting segments of a semver version string via Java regex 【发布时间】:2020-02-15 18:54:39 【问题描述】:

这里是 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 作为限定符

有什么想法吗?

【问题讨论】:

【参考方案1】:

注意:

您不应在字符串文字中转义 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

【讨论】:

以上是关于通过 Java 正则表达式提取 semver 版本字符串的片段的主要内容,如果未能解决你的问题,请参考以下文章

java怎么通过正则表达式提取一个文件里面的所有邮箱?

java正则表达式提取xxxx(yyyy)中的内容

semver:匹配预发布后缀 (3.* =/= 3.4.5-1)

Java正则表达式

java正则表达式提取网址

用java正则表达式提取java程序中的注释