UNIX文件路径的最正确的正则表达式是什么?

时间:2009-02-11 16:57:54

标签: regex path

UNIX文件路径的最正确的正则表达式(正则表达式)是什么?

例如,要检测这样的事情:

/usr/lib/libgccpp.so.1.0.2

制作一个与大多数文件匹配的正则表达式非常容易,但最好的是哪一个,包括可以检测转义的空格序列的正则表达式,以及UNIX上通常不会在文件路径中找到的异常字符。

此外,是否有几种不同编程语言的库函数提供文件路径正则表达式?

6 个答案:

答案 0 :(得分:14)

如果你不介意识别路径的误报,那么你真的只需要确保路径不包含NUL字符;其他一切都是允许的(特别是,/是名称分隔符)。更好的方法是使用适当的文件IO函数(例如Java中的File.exists()File.getCanonicalFile())来解析给定路径。

答案很长:

这是 operating system file system 依赖。例如,Wikipedia comparison of file systems注意到除了文件系统强加的限制外,

  

MS-DOS,Microsoft Windows和OS / 2   禁止使用字符\ / : ? * " > < |NUL   在文件和目录中   在所有文件系统中命名 。 Unix系统   和Linux禁止使用/个字符   和NUL在文件和目录名称中   跨所有文件系统

在Windows中,以下reserved device names也不允许作为文件名:

CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5,
COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, 
LPT5, LPT6, LPT7, LPT8, LPT9

答案 1 :(得分:11)

匹配所有UNIX路径的正确正则表达式是:[^ \ 0] +

即一个或多个不是NUL的字符。

答案 2 :(得分:8)

对于已回答此问题的其他人,重要的是要注意某些应用程序需要稍微不同的正则表达式,具体取决于转义字符在您正在编写的程序中的工作方式。例如,如果你正在编写一个shell,并希望用空格和其他特殊字符分隔命令,那么你必须修改你的正则表达式,使其只包括具有特殊字符的单词(如果这些字符被转义)。

因此,例如,有效路径为

  /usr/bin/program\ with\ space 

而不是

  /usr/bin/program with space 

将引用带有“with”和“space”

参数的“/ usr / bin / program”

以上示例的正则表达式可以是“([^ \ 0] \ | \\)*”

我一直在研究的正则表达式是(以“可读性”分隔的换行符):

  "\(                    # Either
       [^\0 !$`&*()+]    # A normal (non-special) character
     \|                  # Or
       \\\(\ |\!|\$|\`|\&|\*|\(|\)|\+\)   # An escaped special character
   \)\+"                   # Repeated >= 1 times

转换为

  "\([^\0 !$`&*()+]\|\\\(\ |\!|\$|\`|\&|\*|\(|\)|\+\)\)\+"

创建自己的特定正则表达式也应该相对简单。

答案 3 :(得分:4)

我不确定正则表达式检查对于系统有多常见,但大多数编程语言(尤其是跨平台语言)提供“文件存在”检查,这将考虑这种事情

出于好奇,这些路径在哪里输入?你能控制到更大的程度,直到你不必检查路径的各个部分吗?例如,使用文件选择器对话框?

答案 4 :(得分:4)

^(/)?([^/\0]+(/)?)+$

这将接受文件系统中合法的每个路径,例如 extX reiserfs

它仅丢弃包含NUL或双(或更多)斜杠的路径名。根据Unix规范的其他所有内容都应该是合法的(我对此结果也感到惊讶)。

答案 5 :(得分:0)