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

Nei*_*eil 17 regex path

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

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

/usr/lib/libgccpp.so.1.0.2
Run Code Online (Sandbox Code Playgroud)

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

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

Zac*_*ena 14

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

答案很长:

这是依赖于操作系统文件系统的.例如,Wikipedia对文件系统的比较指出,除了文件系统强加的限制外,

MS-DOS,Microsoft Windows和OS/2禁止所有文件系统中的字符\ / : ? * " > < |以及NUL 文件和目录名称.Unices和Linux不允许所有文件系统中的字符 以及文件和目录名称 ./NUL

在Windows中,以下保留的设备名称也不允许作为文件名:

CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5,
COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, 
LPT5, LPT6, LPT7, LPT8, LPT9
Run Code Online (Sandbox Code Playgroud)


Dar*_*ron 11

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

也就是说,一个或多个不是NUL的字符.

  • 这不是匹配有效文件路径的好正则表达式 (7认同)
  • 并且'//'是一个有效的路径,有或没有's (6认同)

ste*_*ble 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 !$`&*()+]\|\\\(\ |\!|\$|\`|\&|\*|\(|\)|\+\)\)\+"

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

  • 作为枚举所有转义字符的替代方法,您可以简单地创建一个由转义符后跟转义字符类`([^ !$\`&amp;*()+]|(\\[ !$ \`&amp;*()+]))+` (3认同)

Dan*_*lor 5

^(/)?([^/\0]+(/)?)+$
Run Code Online (Sandbox Code Playgroud)

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

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

  • 双斜杠在 POSIX 和实践中都适用于 Unix 路径,因此您的正则表达式不正确。unix 路径名中不允许的唯一字符(或者更确切地说,八位字节)是 \0 (2认同)