Java正则匹配Conan依赖:适配多场景需求求助
解决Conan依赖正则匹配问题
核心问题分析
你当前的正则主要有两个问题:
- 版本匹配规则未包含
+号,导致无法捕获1.59.0+4这类带构建元的SemVer版本 - 未处理注释场景,需要先剥离
#及后续内容再匹配
修正后的方案
步骤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
相关产品推荐
相关产品推荐

