【问题标题】:Path validation - My RegEx is matching a malformed path and I can't figure out why路径验证 - 我的 RegEx 匹配格式错误的路径,我不知道为什么
【发布时间】:2021-12-25 06:05:40
【问题描述】:

这是我目前的表达方式:https://regex101.com/r/BertHu/4/

^(?:(?:[a-z]:|\\\\[a-z0-9_.$●-]+\\[a-z0-9_.$●-]+)\\|\\?[^\\\/:*?"<>|\r\n]+\\?)*(?:[^\\\/:*?"<>|\r\n]+\\)*[^\\\/:*?"<>|\r\n]*$

我使用的正则表达式是基于this implementation from Oreilly.

这是一个细分(我必须从 Oreilly 的表达式中修复一些未转义的字符):

(?:(?:[a-z]:|\\\\[a-z0-9_.$\●-]+\\[a-z0-9_.$\●-]+)\\|  # Drive
\\?[^\\\/:*?"<>|\r\n]+\\?)                             # Relative path
(?:[^\\\/:*?"<>|\r\n]+\\)*                             # Folder
[^\\\/:*?"<>|\r\n]*                                    # File

我在 PowerShell 中实现这个,表达式将不区分大小写。

我遇到的问题是它匹配以下格式错误的路径(我敢肯定更多类似的路径):C:\foo\C:\bar

我无法确切理解为什么会发生这种情况,但我认为这与表达式的驱动部分有关:

^(?:(?:[a-z]:|\\\\[a-z0-9_.$●-]+\\[a-z0-9_.$●-]+)\\|

我不知道如何从上面排除第二个:。也许我完全忽略了一些明显的东西。

任何帮助都将不胜感激,因为我整天都在研究这个表达式。

非常感谢。

【问题讨论】:

  • 你真正想要实现什么?可能有一种更简单的方法,没有可能容易出错的正则表达式。
  • 我希望能够可靠地确定任何给定的 Windows 路径是否有效构建,而无需实际测试其存在。在 RegEx 中这对我来说也是一种练习,因为我不太擅长它。
  • 另外,PowerShell 中的路径验证方式并不多。大多数人只是使用 Test-Path,或转换为 [System.IO.FileInfo]。看到这个:4sysops.com/archives/…我想尽可能地填补空白。
  • 好的,你想练习正则表达式。但如果您只想检查路径是否有效,您可以使用Test-Path -Path 'Patch you want to check' -IsValid。无需重新发明轮子。我正是这个意思。 ;-)
  • 这是由于^(?:(?:[a-z]:|\\\\[a-z0-9_.$●-]+\\[a-z0-9_.$●-]+)\\|\\?[^\\\/:*?"&lt;&gt;|\r\n]+\\?)* 末尾的*。删除它,见demo

标签: regex powershell validation path


【解决方案1】:

在 regex101.com 和其他一些正则表达式测试站点上测试正则表达式时,您可以选择模式的一部分以查看它们的结束位置以及它们是否被量化。在这里,我点击了第一个(?:,看到了

该组旨在匹配零次或多次出现的

  • (?:[a-z]:|\\\\[a-z0-9_.$●-]+\\[a-z0-9_.$●-]+)\\ - 一个字母和一个:,或一个\ 和出现\\ 和一个或多个字母数字、下划线、.$- 字符和然后是\ char
  • | - 或
  • \\?[^\\\/:*?"&lt;&gt;|\r\n]+\\? - 可选的\,除了\/:*?"&lt;&lt;&lt;,@9876543443之外的一个或多个字符@、CR 和 LF 字符,以及可选的 \ 字符。

因此,虽然第二个选项不允许使用分号,但第一个选项允许,并且当它们重复时,它们会连续匹配部分字符串。

删除该星号将解决问题,因为模式的其余部分已经与有效的文件名字符匹配。

^(?:(?:[a-z]:|\\\\[a-z0-9_.$●-]+\\[a-z0-9_.$●-]+)\\|\\?[^\\/:*?"<>|\r\n]+\\?)(?:[^\\/:*?"<>|\r\n]+\\)*[^\\/:*?"<>|\r\n]*$

请参阅regex demo

请注意,您不需要在 Powershell 正则表达式模式(以及使用字符串文字(C#、Java 等)定义的任何正则表达式模式)中转义正斜杠,因为正斜杠不是特殊的正则表达式元字符。

【讨论】:

  • 另一个想法是尝试描述所有可能的前缀,this regex 可能会更严格一些。
猜你喜欢
  • 2020-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 2014-10-05
  • 1970-01-01
相关资源
最近更新 更多