路径验证 - 我的正则表达式匹配格式错误的路径,但我不明白为什么

fmo*_*on1 5 regex validation powershell path

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

\n
^(?:(?:[a-z]:|\\\\\\\\[a-z0-9_.$\xe2\x97\x8f-]+\\\\[a-z0-9_.$\xe2\x97\x8f-]+)\\\\|\\\\?[^\\\\\\/:*?"<>|\\r\\n]+\\\\?)*(?:[^\\\\\\/:*?"<>|\\r\\n]+\\\\)*[^\\\\\\/:*?"<>|\\r\\n]*$\n
Run Code Online (Sandbox Code Playgroud)\n

我使用的正则表达式基于Oreilly 的实现。

\n

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

\n
(?:(?:[a-z]:|\\\\\\\\[a-z0-9_.$\\\xe2\x97\x8f-]+\\\\[a-z0-9_.$\\\xe2\x97\x8f-]+)\\\\|  # Drive\n\\\\?[^\\\\\\/:*?"<>|\\r\\n]+\\\\?)                             # Relative path\n(?:[^\\\\\\/:*?"<>|\\r\\n]+\\\\)*                             # Folder\n[^\\\\\\/:*?"<>|\\r\\n]*                                    # File\n
Run Code Online (Sandbox Code Playgroud)\n

我正在 PowerShell 中实现此功能,并且表达式不区分大小写。

\n

我遇到的问题是它与以下格式错误的路径匹配(并且我确信还有更多类似的路径):C:\\foo\\C:\\bar

\n

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

\n

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

\n

我不知道如何:从上面排除第二个。也许我完全忽略了一些显而易见的事情。

\n

任何帮助都将非常感激,因为我花了一整天的时间来研究这个表达式。

\n

非常感谢。

\n

Wik*_*żew 1

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

\n

在此输入图像描述

\n

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

\n
    \n
  • (?:[a-z]:|\\\\\\\\[a-z0-9_.$\xe2\x97\x8f-]+\\\\[a-z0-9_.$\xe2\x97\x8f-]+)\\\\- 一个字母和一个,:或者一个和一个或多个字母数字,下划线,,,,\\字符,然后是一个字符\\\\.$\xe2\x97\x8f-\\
  • \n
  • |- 或者
  • \n
  • \\\\?[^\\\\\\/:*?"<>|\\r\\n]+\\\\?- 一个可选的\\、除\\/:*?"<>|、 CR 和 LF 字符之外的一个或多个字符,以及一个可选\\字符。
  • \n
\n

因此,尽管第二个替代方案不允许使用分号,但第一个替代方案允许使用分号,并且当它们重复时,它们会连续匹配字符串的各个部分。

\n

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

\n
^(?:(?:[a-z]:|\\\\\\\\[a-z0-9_.$\xe2\x97\x8f-]+\\\\[a-z0-9_.$\xe2\x97\x8f-]+)\\\\|\\\\?[^\\\\/:*?"<>|\\r\\n]+\\\\?)(?:[^\\\\/:*?"<>|\\r\\n]+\\\\)*[^\\\\/:*?"<>|\\r\\n]*$\n
Run Code Online (Sandbox Code Playgroud)\n

请参阅正则表达式演示

\n

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

\n