Java 非捕获组中的捕获组
我目前正在努力解析一个类似于版本的字符串 迄今为止我的正则表达式Java 非捕获组中的捕获组,java,regex,Java,Regex,我目前正在努力解析一个类似于版本的字符串 迄今为止我的正则表达式v(\\d+)\ud+(:\u(\\ d+))应与以下格式的字符串匹配:vVersion\u InterimVersion\u PatchVersion。我的目标是,最后一个匹配组(\u PatchVersion)是可选的 我的问题是可选部分。字符串v1\u 00将给我一个匹配器。groupCount为3。我本以为分组数是2。所以我猜要么我的正则表达式错了,要么我在理解matcher.groupCount时遇到了问题 public
v(\\d+)\ud+(:\u(\\ d+))
应与以下格式的字符串匹配:vVersion\u InterimVersion\u PatchVersion。我的目标是,最后一个匹配组(\u PatchVersion)是可选的
我的问题是可选部分。字符串v1\u 00
将给我一个匹配器。groupCount
为3。我本以为分组数是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不匹配,则其值为空。检查组3中的空值:
见:
结果:
1>0>0
或一个可选的.ofNullable(matcher.group(3)).map(Integer::parseInt)。对于一个一行的非捕获组,orElse(0)
仍然是一个组,这就是为什么它返回它所做的。groupCount
实际上是Pattern
的一种状态,而不是Matcher
,主要用于使用类似Matcher的索引集合的东西。
if (matcher.group(3) != null) {
patchVersion = Integer.parseInt(matcher.group(3));
}
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);
}