通过 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 风格)字符串并提取其主要部分:
主要版本号 次要版本号 补丁号 限定符(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
我需要对我的正则表达式和/我们对 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 版本字符串的片段的主要内容,如果未能解决你的问题,请参考以下文章