【发布时间】:2020-07-13 14:49:15
【问题描述】:
我对正则表达式语法有点困惑。我需要构建两个单独的正则表达式模式来检测文件名在 Windows 中是否合法。 一种是匹配除这些字符(非法字符)之外的任何单词 -
*" :" / \ | ? "
第二个模式是匹配除这些单词之外的任何单词(保留文件名)-
PRN、AUX、时钟、NUL、CON、COM、LPT
我发现这个模式的组合版本看起来像这样@"^(?!(?:PRN|AUX|CLOCK\$|NUL|CON|COM\d|LPT\d)(?:\..+)?$)[^\x00-\x1F\xA5\\?*:\"";|\/<>]+(?<![\s.])$",但关键是我需要将这两者分开。
谁能帮帮我?提前谢谢你。
【问题讨论】:
-
1)
^(?!.*(?:PRN|AUX|CLOCK\$|NUL|CON|COM\d|LPT\d)(?:\..+)?$).*, 2)^[^\x00-\x1F\xA5\\?*:"";|/<>]+(?<![\s.])$ -
正则表达式无法验证文件名,因为哪些名称是有效的 is not determined by the characters in the name。要验证文件名,您必须创建文件并查看它是否抛出。
-
如果您使用的是 Windows,则应首先通过将组件名称传递给 WinAPI
GetFullPathNameW来检查 DOS 设备和尾随空格和点的规则。如果结果不同(例如“con” -> “\\.\con”,或“spam . . .” -> “spam”),则它不是有效名称。始终让操作系统先决定这一点。 -
@DourHighArch:打开保留的 DOS 设备名称,例如“C:/Temp/con :spam”不一定会失败。在这种情况下,如果进程连接到控制台,它将打开“//./con”。同样创建一个名为“spam ...”的文件不会失败,而是创建“垃圾邮件”。当需要进行名称验证时,您必须通过
GetFullPathNameW检查保留名称。