杰瑞科技汇

Java正则表达式如何匹配文件名?

Java 正则表达式处理文件名

在 Java 中,正则表达式可以用来验证、提取或处理文件名,以下是几种常见的文件名处理场景及相应的正则表达式解决方案。

验证文件名是否有效

基本文件名验证(允许字母、数字、下划线、连字符和点)

import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class FileNameValidator {
    public static boolean isValidFileName(String fileName) {
        // 基本文件名验证:允许字母、数字、下划线、连字符和点
        // 但不能以点开头或结尾,不能包含连续的点
        String regex = "^[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9]$";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(fileName);
        return matcher.matches();
    }
    public static void main(String[] args) {
        System.out.println(isValidFileName("file.txt"));      // true
        System.out.println(isValidFileName("my-file.txt"));   // true
        System.out.println(isValidFileName("_hidden.txt"));    // false (以_开头)
        System.out.println(isValidFileName(".hidden"));        // false (以.开头)
        System.out.println(isValidFileName("file..txt"));     // false (连续点)
    }
}

更严格的文件名验证(排除Windows保留字符)

public static boolean isValidFileNameStrict(String fileName) {
    // 排除Windows保留字符: \ / : * ? " < > |
    String regex = "^[^\\\\/:*?\"<>|]+\\.[^\\\\/:*?\"<>|]+$";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(fileName);
    return matcher.matches();
}

提取文件名和扩展名

提取文件名(不含扩展名)

public static String getFileNameWithoutExtension(String fileName) {
    // 匹配最后一个点之前的内容
    String regex = "^(.+?)\\.[^.]+$";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(fileName);
    if (matcher.find()) {
        return matcher.group(1);
    }
    return fileName; // 如果没有扩展名,返回整个文件名
}

提取文件扩展名

public static String getFileExtension(String fileName) {
    // 匹配最后一个点之后的内容
    String regex = "^.*\\.([^.]+)$";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(fileName);
    if (matcher.find()) {
        return matcher.group(1);
    }
    return ""; // 如果没有扩展名,返回空字符串
}

处理文件名中的特殊字符

清理文件名(移除或替换非法字符)

public static String sanitizeFileName(String fileName) {
    // 替换Windows非法字符为下划线
    String regex = "[\\\\/:*?\"<>|]";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(fileName);
    return matcher.replaceAll("_");
}

匹配特定模式的文件名

匹配所有.txt文件

public static boolean isTextFile(String fileName) {
    String regex = "^.*\\.txt$";
    return Pattern.matches(regex, fileName);
}

匹配图片文件(jpg, png, gif)

public static boolean isImageFile(String fileName) {
    String regex = "^.*\\.(jpg|jpeg|png|gif)$";
    return Pattern.matches(regex, fileName);
}

使用正则表达式查找文件

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
public class FileFinder {
    public static List<File> findFilesByPattern(File directory, String pattern) {
        List<File> result = new ArrayList<>();
        File[] files = directory.listFiles();
        if (files != null) {
            for (File file : files) {
                if (file.isFile() && Pattern.matches(pattern, file.getName())) {
                    result.add(file);
                }
            }
        }
        return result;
    }
    public static void main(String[] args) {
        File dir = new File("/path/to/directory");
        List<File> textFiles = findFilesByPattern(dir, "^.*\\.txt$");
        System.out.println("Found " + textFiles.size() + " text files");
    }
}

注意事项

  1. 跨平台兼容性:不同操作系统对文件名的限制不同,Windows有更严格的限制
  2. 大小写敏感:在Windows上文件名不区分大小写,但在Linux/macOS上区分
  3. 保留文件名:某些文件名如CON, PRN, AUX等在Windows上是保留的
  4. Unicode支持:如果需要处理非ASCII字符,确保使用适当的编码

代码示例可以根据具体需求进行调整,以满足不同的文件名处理场景。

分享:
扫描分享到社交APP
上一篇
下一篇