【发布时间】: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_.$●-]+)\\|\\?[^\\\/:*?"<>|\r\n]+\\?)*末尾的*。删除它,见demo。
标签: regex powershell validation path