javascript - 正则表达式窗口路径验证器

标签 javascript regex validation

我试图为 Javascript 找到一个 Windows 文件路径验证,但似乎没有一个能满足我想要的要求,所以我决定自己构建它。

要求如下:

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

  • 这是我想出的正则表达式:
    /^([a-z]:((\|/|\\|//))|(\\|//))[^<>:"|?*]+/i

    但是有一些问题:
  • 它还验证包含特殊字符的文件名
    规则中提到的
  • 它不包括最后一条规则(不能以:. 或空格结尾)


  • 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>");
    });

    最佳答案

    不幸的是,正则表达式的 JavaScript 风格不支持后视,
    但幸运的是它确实支持前瞻,这是关键因素
    如何构建正则表达式。

    让我们从一些观察开始:

  • 在点、斜线、反斜线或空格之后不能出现另一个
    点、斜线或反斜线。 “禁止”字符集还包括\n , 因为这些字符都不能是文件名的最后一个字符
    或其段(在点或(反)斜线之间)。
  • 路径中允许的其他字符是您提到的字符
    (除了...),但“排除列表”还必须包含一个点,
    斜线、反斜线、空格和 \n (第 1 点中提到的字符)。
  • 在“初始部分”(C:\) 之后可以有多个实例
    第 1 点或第 2 点中提到的字符。

  • 考虑到这些点,我从 3 个部分构建了正则表达式:
  • “起始”部分,匹配驱动器号、冒号和最多 2 个
    斜线(向前或向后)。
  • 第一种选择 - 点、斜线、反斜线或空格,
    负前瞻 - 每个字符后面的“禁止”字符列表
    上述字符(见第 1 点)。
  • 第二种选择 - 第 2 点中提到的字符。
  • 上述两种选择都可以多次出现( + 量词)。

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

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

    但是如果你在不同的行中有多个路径,并匹配它们
    全局一次性添加 gm选项。

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

    注:我想 !也应该被视为禁忌
    特点。如果您同意,请将其添加到第二个选项中,例如后 * .

    关于javascript - 正则表达式窗口路径验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51494579/

    相关文章:

    javascript - 如何在 node.js 和 SQLite3 中使用 document.querySelector 和 require

    regex - Qt 正则表达式 (? : [Ff]eat[. ]? )|(? : [[Ff]eaturing][. ]?)

    python - 如何从字符串中每个单词的末尾删除特殊字符?

    regex - 在 Postgresql 中处理缩写

    spring - @Autowired 验证器内的 DAO

    php - 检查使用自定义表单请求类时是否存在任何验证错误

    javascript - 为什么 angular2 表单不能正确地与 html <form> 元素一起使用?

    javascript - 数学 - 在值上添加百分比,但限制为最大值?

    javascript - 测试结合 Observables 的函数

    javascript - 表单提交时未定义函数