不多bb,應該是80%可用。除根路徑如C:\\或/
,後綴不要加/
。
public enum OSType {
LINUX,
WINDOWS,
OTHERS;
}
然後判斷路徑是否合法:
private static final Pattern linux_path_pattern=Pattern.compile("(/([a-zA-Z0-9][a-zA-Z0-9_\\-]{0,255}/)*([a-zA-Z0-9][a-zA-Z0-9_\\-]{0,255})|/)");
private static final Pattern windows_path_pattern=Pattern.compile("(^[A-Z]:((\\\\|/)([a-zA-Z0-9\\-_]){1,255}){1,255}|([A-Z]:(\\\\|/)))");
/**
* check path is valid in windows and linux
* @param path path to be validate
* @param platform valid value: linux,windows
* @return whether the path is valid
* **/
public static boolean checkPathValid(String path,String platform){
if (platform.toLowerCase().equals(OSType.LINUX.name().toLowerCase())) return checkPatternMatch(linux_path_pattern,path);
if (platform.toLowerCase().equals(OSType.WINDOWS.name().toLowerCase())) return checkPatternMatch(windows_path_pattern,path);
return false;
}
private static boolean checkPatternMatch(Pattern pattern,String target){
return pattern.matcher(target).matches();
}
主要思路
linux_path_pattern=Pattern.compile("(/([a-zA-Z0-9][a-zA-Z0-9_\\-]{0,255}/)*([a-zA-Z0-9][a-zA-Z0-9_\\-]{0,255})|/)");
其中:
[a-zA-Z0-9][a-zA-Z0-9_\\-]{0,255}
模式1:代表以數字或字母[a-zA-Z0-9]
開頭,後面字母或下劃線和破折號[a-zA-Z0-9_\\-]
可以出現0-255次。
([a-zA-Z0-9][a-zA-Z0-9_\\-]{0,255}/)*
代表上面的模式1可以出現0到多次。後面使用相同的[a-zA-Z0-9][a-zA-Z0-9_\\-]{0,255}
模式來禁止後面加/
。