You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java正则匹配Conan依赖:适配多场景需求求助

解决Conan依赖正则匹配问题

核心问题分析

你当前的正则主要有两个问题:

  1. 版本匹配规则未包含+号,导致无法捕获1.59.0+4这类带构建元的SemVer版本
  2. 未处理注释场景,需要先剥离#及后续内容再匹配

修正后的方案

步骤1:先剥离注释

用简单的正则预处理输入字符串,去掉注释部分:

// 去掉#及后面的所有内容,同时清理前后空格
String cleanDependency = input.replaceAll("\\s*#.*$", "").trim();

步骤2:修正后的依赖匹配正则

调整版本部分的字符集,加入+号支持,同时保留原有场景的兼容性:

String regex = "^(?<name>[\\d\\w][\\d\\w+\\.-]+)\\/(?<version>[\\d\\w][\\d\\w+\\.-]+)(@(?<owner>[\\w-]+))?(\\/(?<channel>.+))?$";

正则各部分说明

  • (?<name>[\\d\\w][\\d\\w+\\.-]+):匹配依赖名称,允许数字/字母开头,后续支持数字、字母、+、.、-、_
  • (?<version>[\\d\\w][\\d\\w+\\.-]+):匹配版本,加入+号支持,覆盖1.59.0+4、1.0.2g等格式
  • (@(?<owner>[\\w-]+))?:可选的所有者部分,支持字母、数字、下划线、连字符,可根据Conan实际规则调整字符范围
  • (\\/(?<channel>.+))?:可选的渠道部分,允许任意非空字符,支持无所有者直接带渠道的场景

完整Java示例代码

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ConanDepParser {
    public static void main(String[] args) {
        // 注释清理正则
        String commentPattern = "\\s*#.*$";
        // 依赖匹配正则
        String depRegex = "^(?<name>[\\d\\w][\\d\\w+\\.-]+)\\/(?<version>[\\d\\w][\\d\\w+\\.-]+)(@(?<owner>[\\w-]+))?(\\/(?<channel>.+))?$";
        Pattern pattern = Pattern.compile(depRegex);

        // 测试所有场景
        String[] testInputs = {
            "boost_atomic/1.59.0+4@owner/release",
            "Poco/1.9.0@pocoproject/stable",
            "zlib/1.2.11@conan/stable",
            "freetype/2.10.1/stable",
            "openssl/1.0.2g/stable",
            "openssl/1.0.2g",
            "openssl/1.0.2g@owner",
            "zlib/1.2.11@conan/stable # 这是一条注释"
        };

        for (String input : testInputs) {
            String cleanInput = input.replaceAll(commentPattern, "").trim();
            if (cleanInput.isEmpty()) continue;

            Matcher matcher = pattern.matcher(cleanInput);
            if (matcher.matches()) {
                System.out.println("原输入: " + input);
                System.out.println("  名称: " + matcher.group("name"));
                System.out.println("  版本: " + matcher.group("version"));
                System.out.println("  所有者: " + (matcher.group("owner") != null ? matcher.group("owner") : "无"));
                System.out.println("  渠道: " + (matcher.group("channel") != null ? matcher.group("channel") : "无"));
                System.out.println("---");
            } else {
                System.out.println("原输入: " + input + " 匹配失败");
                System.out.println("---");
            }
        }
    }
}

额外说明

  • 如果需要严格遵循SemVer标准,可以将版本部分替换为更精准的正则,但会牺牲对1.0.2g这类非标准版本的兼容性
  • 所有者部分如果需要支持更多字符(如.),可将[\\w-]+调整为[\\w\\.-]+

内容的提问来源于stack exchange,提问作者zepol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 07:10:29