用于验证 Linux 文件夹路径的正则表达式模式
Regex pattern to validate Linux folder path
使用JAVA。
我正在尝试找到一种更优雅的方法来 验证 Linux 文件夹路径 (不包括文件名)。
到目前为止我得到的是:"^\/$|^((\/([a-zA-Z0-9_-]+))+)$"
文件夹路径应仅包含以下字符:字母、数字、破折号或下划线.
测试用例
有效/匹配:
/
/abc
/abc/abc/abc/abc
无效/不匹配:
- null 或 空字符串
/abc/
/abc/abc/abc/abc/
给你:
\/[a-zA-Z0-9_\/-]*[^\/]$
编辑
第一个字符匹配正斜杠 /
。以下字符组匹配 a-z、A-Z、0-9、下划线、正斜杠和破折号(所有可接受的目录和文件名字符)。下面的星号使模式匹配该字符组 0 次或更多次(因此这些字符的任何组合)。最后一个字符组有一个否定 ^
意味着它匹配除字符组中的任何内容之外的任何内容,这是我们不想匹配的最后一个正斜杠。最后 $
结束字符串。
你的 RegEx 问题
您提供的 RegEx 正在处理测试用例。
您可以甚至通过删除反斜杠 \
和外括号来减少它。开始 ^
和结束 $
只需要一次(围绕两个备选方案)。
使用正则表达式的可能解决方案
您可以测试 RegEx on RegexPlanet.com (点击 Java- 按钮进行测试)
^/|(/[a-zA-Z0-9_-]+)+$
或同等水平(参见 RegexPlanet 上的演示)
^/|(/[\w-]+)+$
解释:
\w
匹配 word-character(与 [a-zA-Z0-9_]
相同,不匹配 破折号 )。
Java 代码中的实现:
public boolean isValidLinuxDirectory(String path) {
Pattern linuxDirectoryPattern = Pattern.compile("^/|(/[a-zA-Z0-9_-]+)+$");
return path != null && !path.trim().isEmpty() && linuxDirectoryPattern.matcher( path ).matches();
}
使用 File
的替代解决方案
Returns:
true
if and only if the file denoted by this abstract pathname exists and is a directory; false
otherwise
因此,如果 运行 在 Linux 机器上并且 folder/directory 存在,它可能只会验证您的要求(有效 Linux 文件夹)。
public boolean isValidExistingDirectory(String path) {
if (path == null || path.trim().isEmpty()) return false;
File file = new File( path );
return file.isDirectory();
}
扩展解决方案
如评论中所述,special form of root //
也应该有效。然后使用这个正则表达式:
^/|//|(/[\w-]+)+$
支持:
- 根目录
/
- 特殊形式的根目录
//
- 任何非根目录,其名称由字母、数字、破折号或下划线组成(例如
/abc/123/_abc-123
)
另见
- What is the most correct regular expression for a UNIX file path?
- Regular expression to validate windows and linux path with extension
- what is path //, how is it different from /
要涵盖包括根目录在内的所有情况,您需要以下内容:
^\/$|(\/[a-zA-Z_0-9-]+)+$
参见 Regex Demo 使用全局和多行修饰符。
使用JAVA。 我正在尝试找到一种更优雅的方法来 验证 Linux 文件夹路径 (不包括文件名)。
到目前为止我得到的是:"^\/$|^((\/([a-zA-Z0-9_-]+))+)$"
文件夹路径应仅包含以下字符:字母、数字、破折号或下划线.
测试用例
有效/匹配:
/
/abc
/abc/abc/abc/abc
无效/不匹配:
- null 或 空字符串
/abc/
/abc/abc/abc/abc/
给你:
\/[a-zA-Z0-9_\/-]*[^\/]$
编辑
第一个字符匹配正斜杠 /
。以下字符组匹配 a-z、A-Z、0-9、下划线、正斜杠和破折号(所有可接受的目录和文件名字符)。下面的星号使模式匹配该字符组 0 次或更多次(因此这些字符的任何组合)。最后一个字符组有一个否定 ^
意味着它匹配除字符组中的任何内容之外的任何内容,这是我们不想匹配的最后一个正斜杠。最后 $
结束字符串。
你的 RegEx 问题
您提供的 RegEx 正在处理测试用例。
您可以甚至通过删除反斜杠 \
和外括号来减少它。开始 ^
和结束 $
只需要一次(围绕两个备选方案)。
使用正则表达式的可能解决方案
您可以测试 RegEx on RegexPlanet.com (点击 Java- 按钮进行测试)
^/|(/[a-zA-Z0-9_-]+)+$
或同等水平(参见 RegexPlanet 上的演示)
^/|(/[\w-]+)+$
解释:
\w
匹配 word-character(与 [a-zA-Z0-9_]
相同,不匹配 破折号 )。
Java 代码中的实现:
public boolean isValidLinuxDirectory(String path) {
Pattern linuxDirectoryPattern = Pattern.compile("^/|(/[a-zA-Z0-9_-]+)+$");
return path != null && !path.trim().isEmpty() && linuxDirectoryPattern.matcher( path ).matches();
}
使用 File
的替代解决方案
Returns:
true
if and only if the file denoted by this abstract pathname exists and is a directory;false
otherwise
因此,如果 运行 在 Linux 机器上并且 folder/directory 存在,它可能只会验证您的要求(有效 Linux 文件夹)。
public boolean isValidExistingDirectory(String path) {
if (path == null || path.trim().isEmpty()) return false;
File file = new File( path );
return file.isDirectory();
}
扩展解决方案
如评论中所述,special form of root //
也应该有效。然后使用这个正则表达式:
^/|//|(/[\w-]+)+$
支持:
- 根目录
/
- 特殊形式的根目录
//
- 任何非根目录,其名称由字母、数字、破折号或下划线组成(例如
/abc/123/_abc-123
)
另见
- What is the most correct regular expression for a UNIX file path?
- Regular expression to validate windows and linux path with extension
- what is path //, how is it different from /
要涵盖包括根目录在内的所有情况,您需要以下内容:
^\/$|(\/[a-zA-Z_0-9-]+)+$
参见 Regex Demo 使用全局和多行修饰符。