正则表达式 Windows 路径验证器

2024-02-09

我试图找到一个针对 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 风格的正则表达式不支持lookbehinds, 但幸运的是它确实支持lookaheads,这是关键因素 如何构建正则表达式。

让我们从一些观察开始:

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

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

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

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

  • “起始”部分,匹配驱动器号、冒号和最多 2 个 斜线(向前或向后)。
  • 第一个选择 - 点、斜杠、反斜杠或空格, 带有负向前瞻 - 每个后的“禁止”字符列表 上述字符(参见第 1 点)。
  • 第二种选择 - 第 2 点中提到的字符。
  • 上述两种选择都可以发生多次(+量词)。

所以正则表达式如下:

  • ^- 字符串的开头。
  • (?:[a-z]:)?- 驱动器号和冒号,可选。
  • [\/\\]{0,2}- 反斜杠或斜杠,0 到 2 次之间。
  • (?: - Start of the non-capturing group, needed due to the + quantifier after it.
    • [.\/\\ ]- 第一个选择。
    • (?![.\/\\\n])- 负向前视 - “禁止”字符。
  • | - Or.
    • [^<>:"|?*.\/\\ \n]- 第二种选择。
  • )+- 非捕获组结束,可能会出现多次。
  • $- 字符串结尾。

如果您尝试分别匹配每个路径,请仅使用i option.

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正则表达式 Windows 路径验证器 的相关文章

随机推荐

  • 使用单个 HELM 模板的多个资源

    默认情况下 我们一直对每个应用程序 公共 使用单个入口 但根据最近的要求 我们还需要为某些应用程序公开 私有 端点 这意味着我们有一个如下所示的模板 模板 ingress yaml if Values ingress enabled ful
  • 当替换构造函数执行时, std::Optional 不应该包含它的值吗?

    在实际代码中 构造函数可能非常复杂 因此emplace of a std optional可以查询选项本身的状态 当发生这种情况时 通常会有点复杂 但这里有一个 人为的 最小示例 include
  • 更改 UIAlertView 中取消按钮的位置?

    我注意到 当我从 iPhone 主屏幕删除应用程序时 出现的警报视图左侧显示 删除 按钮 右侧显示 取消 按钮 但是 当我使用 UIAlertView 在应用程序中构建删除功能时 按钮似乎仅显示左侧的 取消 和右侧的 删除 我希望我的应用程
  • Android:获取Facebook好友列表

    我正在使用脸书软件开发工具包 https github com facebook facebook android sdk 在墙上张贴消息 现在我需要获取 Facebook 好友列表 有人能帮我解决这个问题吗 编辑 try Facebook
  • Android 设置视图位置 - setY 与 setTop

    我打算以编程方式移动按钮的位置 按钮处于相对布局 我研究发现我们可以使用 setY or setTop 看起来它们的工作原理应该是一样的 但就我而言 setTop 根本不改变位置并且 setY 仅有效 我不确定我误解了什么 但这对我来说很奇
  • 如何摆脱 VS Code 中的“同步更改 1 ↑”按钮?

    最近 由于某种原因 每次我想要将更改推送到 GitHub 存储库时 我都必须按此按钮 我不记得是否有一个设置是我不小心切换的 我也从未在 VS Code 环境之外更改我的存储库 我正在使用 Gatsby GitHub Netlify 设置
  • 软键盘覆盖 PopupWindow 中的 EditText

    我整理了一个简单的测试项目 它显示一个包含 EditText 的 PopupWindow 在 Android 2 2 上 当我点击 EditText 时 会显示软键盘 正如我所期望的那样 但是 软键盘覆盖了 EditText 并且我无法平移
  • APC缓存碎片问题

    我在 CentOS 服务器 5 上运行 APC php 缓存 每天 13 000 次访问 运行 php 5 3 3 APC 3 1 4 和 4Gb RAM 在过去的几周里 我经历了很多 unable to allocate memory f
  • 响应图表不受控制地增长

    我有一个 vue 组件 它实现了 vue chartjs 的 Horizo ntalBar 组件 我将其渲染为 bootstrap vue 表中的单元格 我的愿望是让图表保持固定的高度 但随着窗口的增大 缩小而水平缩放 当页面首次加载时 图
  • 使用堆栈反转数组

    我正在尝试使用堆栈反转数组 但是 我收到错误arr i stack top 在 Eclipse 中解决它的建议是将其更改为arr i stack pop 或添加演员阵容 还有其他方法吗 或者我犯了一个错误 我看到教程和问题询问如何使用堆栈反
  • 如何在 R 中使用 H2o 从 SQL Server 加载表?

    我尝试使用 h2o 将表加载到 R 中 但出现以下错误 my data lt h2o import sql table my sql conn table username password 错误 意外的 HTTP 状态代码 500 服务器
  • Javascript - innerHTML 不适用于 HTML 选择菜单

    在我的 HTML 页面中 我有 2 个选择菜单 其 ID 为 月 和 日 页面加载时 日 为空 月 有 12 个选项 其值 1 12 对应于一月至十二月 month 有一个 onchange 事件调用此函数 function showOut
  • 属性 KeyValuePair.Value 没有 setter

    我正在使用一个Dictionary
  • Java 中的时区

    我允许我的网络应用程序上的用户根据他们选择的时区安排活动 我想向最终用户提供一份良好的时区列表 然后将其轻松转换为java util TimeZone服务器端的对象 String TimeZone getAvailableIds 是我可以使
  • 从 vs 2017 以编程方式连接到 TFS

    我在用TFS 15 x package Error Microsoft TeamFoundation TeamFoundationServerUnauthorizedException TF30063 您无权访问 https myproje
  • 使用钩子时,React 批量状态更新功能是否有效?

    对于类组件 this setState如果在事件处理程序内部 则调用批处理 但是如果状态在事件处理程序之外更新并使用 会发生什么useState hook function Component const a setA useState a
  • StandardScaler -ValueError:输入包含 NaN、无穷大或对于 dtype('float64') 来说太大的值

    我有以下代码 X df X as matrix header 1 col num scaler preprocessing StandardScaler fit X X nor scaler transform X 并得到以下错误 File
  • 如何使用 Objective-C 判断 iPhone 是否连接到 wifi 网络?

    在 Objective C iPhone 应用程序的上下文中 我需要能够判断 iPhone 是否已连接到 wifi 网络 并在可能的情况下侦听此状态的变化 有谁知道如何做到这一点 谢谢 加布伊 正如其他人提到的 可达性样本 https de
  • 在 Reactjs 中的 EsLint“react / jsx-props-no-spreading”错误中禁用

    安装 EsLint 后 我 出现的错误之一如下 禁止传播 propeslint react jsx props no spreading 我想在 EsLint 配置中创建一条规则来忽略此错误 但我发现的示例不起作用 这是创建全局异常的格式
  • 正则表达式 Windows 路径验证器

    我试图找到一个针对 Javascript 的 Windows 文件路径验证 但似乎没有一个能够满足我想要的要求 所以我决定自己构建它 要求如下 路径不能为空 可能以 x x 开头 后跟文件名 无文件 需要延期 文件名不能包含以下特殊字符 文