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

8
使用JAVA。 我正在尝试找到更优雅的方法来验证Linux文件夹路径(不包括文件名)。
目前我所拥有的是这个:^\\/$|^((\\/([a-zA-Z0-9_-]+))+)$
文件夹路径应只包含以下字符:字母,数字,破折号或下划线。
测试用例
有效/匹配:
- / - /abc - /abc/abc/abc/abc
无效/不匹配:
- null或空字符串 - /abc/ - /abc/abc/abc/abc/

优雅的方式是根本不使用正则表达式,而是使用nio库来确定路径是否有效。 - Roddy of the Frozen Peas
你的验证有什么使用场景?为什么你的正则表达式不起作用?也许我们可以找到一个更好的解决方案,而不是使用正则表达式 :) - hc_dev
我的模式是有效的,只是看起来有点笨重,我不确定我是否做得正确。 - afrey
你为什么要将文件夹名称限制为字母数字?一个文件夹名称可以包含接近任何字符。 - Toto
由于我们使用的应用程序要求仅使用字母数字字符。 - afrey
3个回答

7

您的正则表达式问题

您提供的正则表达式在测试案例中有效。

您甚至可以通过删除反斜杠\\和外部括号来简化它。 开始^和结束$仅需要一次(围绕两个替代方案)。

使用正则表达式的可能解决方案

您可以在RegexPlanet.com上测试正则表达式(单击Java按钮进行测试)

^/|(/[a-zA-Z0-9_-]+)+$

或等效(请参见RegexPlanet上的演示)

^/|(/[\w-]+)+$

解释:\w匹配一个单词字符(与[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的替代方案

注意isDirectory()文档中的内容:

返回值: true表示由此抽象路径名表示的文件存在且为目录;否则返回false

因此,只有在Linux机器上运行并且文件夹/目录存在时,它才能验证您的要求(有效的Linux文件夹)。

public boolean isValidExistingDirectory(String path) {
     if (path == null || path.trim().isEmpty()) return false;
     File file = new File( path );
     return file.isDirectory();
}

扩展解决方案

如评论中所述,root的特殊形式//也应该是有效的。然后使用以下正则表达式:

^/|//|(/[\w-]+)+$

它支持:

  1. 根目录 /
  2. 特殊形式的根目录 //
  3. 任何非根目录,名称由字母、数字、短横线或下划线组成(例如/abc/123/_abc-123

另请参阅


非常感谢!非常有帮助! - afrey
^/|/[a-zA-Z0-9_-]+)+$ 不适用于文件夹路径为 // 的情况。^/$|^(/[a-zA-Z0-9_-]+)+$ 可以使用。 - afrey
@afrey 好的。那么请您更新您的问题以满足扩展要求(就像我刚刚所做的那样)。您确定您的正则表达式 ^/$|^(/[a-zA-Z0-9_-]+)+$ 匹配特殊根目录 (//) 吗? - hc_dev

1

这里是代码:\/[a-zA-Z0-9_\/-]*[^\/]$

编辑

第一个字符匹配斜杠/。接下来的字符组匹配a-z、A-Z、0-9、下划线、斜杠和破折号(所有接受的目录和文件名字符)。接下来的星号使模式匹配该字符组0次或多次(因此任何这些字符的组合都可以)。最后一个字符组有一个否定符号^,表示它匹配除了字符组中的内容之外的任何内容,即我们不想匹配的最后一个斜杠。最后使用$结束字符串。


如果你确实要使用文件系统,请查看这个 - Logan Rodie
很好,但它不接受“/”作为路径。这里是一个改进:^\/([a-zA-Z0-9_\/-]*[^\/])?$ - Jaumzera

0
为了覆盖所有情况,包括根目录,您需要以下内容:
^\/$|(\/[a-zA-Z_0-9-]+)+$

查看正则表达式演示,使用全局和多行模式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接