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
作为预选赛有什么想法吗?
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