java - 非捕获组中的捕获组

标签 java regex

我目前正在努力解析类似于版本的字符串。

到目前为止,我的正则表达式 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/

相关文章:

java - 如何识别手机是否空闲?

java - 检查 ZK Window 是否有焦点

r - 隔离文本中的特定数值

python - 新手 Python/正则表达式 : pull strings between <a> tags using regex

Javascript:如何提取字符串中的测量值

java - 如何避免并发 UDP 服务器丢包

java - Thrift 中的 session 管理

java - 将镜像快速启动 Java 项目上传到 App Engine :

regex - 基于Julia中正则表达式的分割线

regex - 使用正则表达式和Powershell从字符串中提取特定数据