【问题标题】:Regex for illegal filenames in windowsWindows中非法文件名的正则表达式
【发布时间】: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.])$",但关键是我需要将这两者分开。

谁能帮帮我?提前谢谢你。

【问题讨论】:

  • 你也可以看看这个:stackoverflow.com/questions/3137097/…
  • 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 检查保留名称。

标签: c# .net regex windows


【解决方案1】:

这个正则表达式实际上检查了三件事。

您可以在此处验证任何正则表达式:https://regex101.com/

这将否定在文本的任何位置出现的所有保留文件名:

    (?:PRN|AUX|CLOCK\$|NUL|CON|COM\d|LPT\d)

但要匹配确切的名称,您需要 ^& 指示文本的开始和结束,因此这适用于第二组:

#1

    ^(?:PRN|AUX|CLOCK\$|NUL|CON|COM\d|LPT\d)$

对于无效字符,这将排除所有给定的字符:

#2

    ^[^\x00-\x1F\xA5\\?*:\"";|\/<>]+$

但它仍然允许.a..a。要排除这三种可能性,您需要:

首先将(?!(?:\..+)?$)添加到开始排除以.开头的名称(即\.

然后将(?&lt;![.]) 添加到末尾以排除以. 结尾的名称

#3

    ^(?!(?:\..+)?$).+(?<![.])$

但这将允许在开头和结尾使用空格的许多其他可能性。

此时您可以修剪文本、忽略无效名称(Windows 将修剪它们)或扩展您的正则表达式,如下所示:

添加 \x20 排除 a a. 但仍允许 a .a

    ^(?!(?:\..+)?$).+(?<![\x20.])$

添加(?!(?:\x20+.+)?$) 排除起始空格:

#3

    ^(?!(?:\x20+.+)?$)(?!(?:\..+)?$).+(?<![\x20.])$

【讨论】:

  • 允许前导空格和点。它唯一被修剪的尾随点和空格,在这种情况下,它只是“”(0x20),而不是空白的一般字符类(\s)。
  • @ErykSun 你是对的,谢谢!我把它纳入我的答案
猜你喜欢
  • 2016-11-16
  • 2013-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 2017-04-29
相关资源
最近更新 更多