Java中如何根据路径前半部分统一不同格式的路径分隔符
路径分隔符统一实现方案(Java)
核心逻辑
- 优先识别特殊路径前缀:如果路径以
\\开头,属于Windows UNC网络路径,直接指定目标分隔符为\ - 统计路径前半段分隔符出现频次:取路径前40%长度的子串,分别统计
/和\的出现次数,出现次数更高的作为目标分隔符 - 全量替换与格式修正:将路径中所有非目标分隔符的路径分隔符替换为目标分隔符,同时合并连续重复的分隔符(UNC路径开头的双反斜杠除外)
完整代码实现
public class PathNormalizer { public static String normalizePath(String rawPath) { if (rawPath == null || rawPath.isEmpty()) { return rawPath; } // 处理UNC网络路径特殊前缀 boolean isUNC = rawPath.startsWith("\\\\"); char targetSeparator; if (isUNC) { targetSeparator = '\\'; } else { // 取前40%路径段统计分隔符频次 int checkLength = Math.max(rawPath.length() * 2 / 5, 1); String checkPart = rawPath.substring(0, checkLength); long slashCount = checkPart.chars().filter(c -> c == '/').count(); long backslashCount = checkPart.chars().filter(c -> c == '\\').count(); // 频次相等时优先取正斜杠,也可根据需求替换为系统默认分隔符 File.separatorChar targetSeparator = slashCount >= backslashCount ? '/' : '\\'; } char otherSeparator = targetSeparator == '/' ? '\\' : '/'; // 替换所有非目标分隔符 String replaced = rawPath.replace(otherSeparator, targetSeparator); // 合并连续重复的分隔符 if (isUNC) { return replaced.replaceAll("(\\\\+)\\\\", "$1"); } else { return targetSeparator == '/' ? replaced.replaceAll("/+", "/") : replaced.replaceAll("\\\\+", "\\\\"); } } public static void main(String[] args) { // 测试示例 System.out.println(normalizePath("path/to/file\\example.txt")); System.out.println(normalizePath("\\\\path\\to\\file/example.txt")); } }
测试输出
- 输入
path/to/file\example.txt,输出path/to/file/example.txt - 输入
\\path\to\file/example.txt,输出\\path\to\file\example.txt
内容的提问来源于stack exchange,提问作者Paolo Mossini
相关产品推荐
相关产品推荐

