Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 非捕获组中的捕获组_Java_Regex - Fatal编程技术网

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);
}