我目前正在努力解析类似于版本的字符串。
到目前为止,我的正则表达式 v(\\d+)_(\\d+)(?:_(\\d+))?
应该匹配以下格式的字符串: v版本_临时版本_补丁版本。我的目标是,最后一个匹配组 (_PatchVersion) 是可选的。
我的问题是可选部分。一个字符串 v1_00
会给我一个 3 的 matcher.groupCount
。我本以为 groupCount 是 2。所以我想我的正则表达式是错误的或者我遇到了麻烦理解 matcher.groupCount
。
public static void main(final String[] args) {
final String versionString = "v1_00";
final String regex = "v(\\d+)_(\\d+)(?:_(\\d+))?";
final Matcher matcher = Pattern.compile(regex).matcher(apiVersionString);
if (matcher.matches()) {
final int version = Integer.parseInt(matcher.group(1));
final int interimVersion = Integer.parseInt(matcher.group(2));
int patchVersion = 0;
if (matcher.groupCount() == 3) {
patchVersion = Integer.parseInt(matcher.group(3));
}
// ...
}
}
最佳答案
正则表达式中有多少个捕获组就有多少组。如果您的模式中有 3 组非转义括号,则将有 matcher.group(1)
、matcher.group(2)
和 matcher.group( 3)
。
如果第 3 组不匹配,则其值为 null。检查第 3 组的 null 值:
if (matcher.group(3) != null) {
patchVersion = Integer.parseInt(matcher.group(3));
}
参见 Java online demo :
final String versionString = "v1_00";
final String regex = "v(\\d+)_(\\d+)(?:_(\\d+))?";
final Matcher matcher = Pattern.compile(regex).matcher(versionString);
if (matcher.matches()) {
final int version = Integer.parseInt(matcher.group(1));
final int interimVersion = Integer.parseInt(matcher.group(2));
int patchVersion = 0;
if (matcher.group(3) != null) {
patchVersion = Integer.parseInt(matcher.group(3));
}
System.out.println(version + " > " + interimVersion + " > " + patchVersion);
}
结果:1 > 0 > 0
。
关于java - 非捕获组中的捕获组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48788928/