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");
}
}
注意事项
- 跨平台兼容性:不同操作系统对文件名的限制不同,Windows有更严格的限制
- 大小写敏感:在Windows上文件名不区分大小写,但在Linux/macOS上区分
- 保留文件名:某些文件名如CON, PRN, AUX等在Windows上是保留的
- Unicode支持:如果需要处理非ASCII字符,确保使用适当的编码
代码示例可以根据具体需求进行调整,以满足不同的文件名处理场景。
