正则表达式Windows路径验证器

And*_*osu 2 javascript regex validation

我试图找到Java脚本的Windows文件路径验证,但似乎没有一个可以满足我想要的要求,因此我决定自己构建它。

要求如下:

  • 路径不能为空
  • 可以以x:\,x:\\,\,//开头,然后是文件名(无需文件扩展名)
  • 文件名不能包含以下特殊字符:<>:“ |?*
  • 文件名不能以点或空格结尾

这是我想出的正则表达式: / ^([az]:((\ | / | \\\ ///))|(\\ | //))[^ <>:“ |?*] + /一世

但是有一些问题:

  • 它还会验证包含规则中提到的特殊字符的文件名
  • 它不包含最后一条规则(不能以。或空格结尾)

var reg = new RegExp(/^([a-z]:((\\|\/|\\\\|\/\/))|(\\\\|\/\/))[^<>:"|?*]+/i);
var startList = [
  'C://test',
  'C://te?st.html',
  'C:/test',
  'C://test.html',
  'C://test/hello.html',
  'C:/test/hello.html',
  '//test',
  '/test',
  '//test.html',
  '//10.1.1.107',
  '//10.1.1.107/test.html',
  '//10.1.1.107/test/hello.html',
  '//10.1.1.107/test/hello',
  '//test/hello.txt',
  '/test/html',
  '/tes?t/html',
  '/test.html',
  'test.html',
  '//',
  '/',
  '\\\\',
  '\\',
  '/t!esrtr',
  'C:/hel**o'
];

startList.forEach(item => {
  document.write(reg.test(item) + '  >>>   ' + item);
  document.write("<br>");
});
Run Code Online (Sandbox Code Playgroud)

Val*_*_Bo 5

不幸的是,JavaScript风格的正则表达式不支持先行式,但幸运的是它支持先行,这是构造正则表达式的关键因素。

让我们从一些观察开始:

  1. 在点,斜杠,反斜杠或空格之后,不能再出现另一个点,斜杠或反斜杠。该“禁止”字符集还包括 \n,因为这些字符都不是文件名或其段(点之间或(反)斜杠之间)的最后一个字符。

  2. 路径中允许的其他字符是您提到的字符(...除外),但是“排除列表”中还必须包括点,斜杠,反斜杠,空格和\n(第1点中提到的字符)。

  3. 在“初始部分”(C:\)之后,可以在点1或2中提到多个char实例。

考虑到这些要点,我从三个部分构建了正则表达式:

  • “开始”部分,匹配驱动器号,冒号和最多2个斜杠(向前或向后)。
  • 第一个替代方法-点,斜杠,反斜杠或带负前瞻性的空格-在上述每个字符之后列出“禁止”字符(请参见第1点)。
  • 第二种选择-第2点提到的字符。
  • 以上两种选择都可以多次出现(+量词)。

因此正则表达式如下:

  • ^ -字符串的开头。
  • (?:[a-z]:)? -驱动器号和冒号(可选)。
  • [\/\\]{0,2} -反斜杠或斜杠,介于0到2次之间。
  • (?:-非捕获组的开始,由于+ 后面有量化符而需要。
    • [.\/\\ ] -第一种选择。
    • (?![.\/\\\n]) -负前瞻-“禁止”字符。
  • | - 要么。
    • [^<>:"|?*.\/\\ \n] -第二种选择。
  • )+ -非捕获组的结尾可能会出现多次。
  • $ -字符串的结尾。

如果尝试分别匹配每个路径,请仅使用i选项。

但是,如果您在单独的行中有多个路径,并一次性进行全局匹配,则还要添加gm选项。

有关工作示例,请参见https://regex101.com/r/4JY31I/1

注意:我想也!应该将其视为禁止字符。如果您同意,则将其添加到第二个替代方法中,例如在之后*