用于验证 Linux 文件夹路径的正则表达式模式

Regex pattern to validate Linux folder path

使用JAVA。 我正在尝试找到一种更优雅的方法来 验证 Linux 文件夹路径 (不包括文件名)。

到目前为止我得到的是:"^\/$|^((\/([a-zA-Z0-9_-]+))+)$"

文件夹路径应仅包含以下字符:字母数字破折号下划线.

测试用例

有效/匹配:

无效/不匹配:

给你: \/[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

的替代解决方案

注意 docs on isDirectory():

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-]+)+$

支持:

  1. 根目录/
  2. 特殊形式的根目录//
  3. 任何非根目录,其名称由字母、数字、破折号或下划线组成(例如 /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 使用全局和多行修饰符。