這就是我正在使用的:https : //regex101.com/r/BertHu/3/
^(?:(?:[a-z]:|\\\\[a-z0-9_.$●-] \\[a-z0-9_.$●-] )\\|\\?[^\\\/:*?"<>|\r\n] \\?)*(?:[^\\\/:*?"<>|\r\n] \\)*[^\\\/:*?"<>|\r\n]*$
我使用的正則運算式基于Oreilly 的這個實作。
這是一個細分(我必須從 Oreilly 的運算式中修復一些未轉義的字符):
(?:(?:[a-z]:|\\\\[a-z0-9_.$\●-] \\[a-z0-9_.$\●-] )\\| # Drive
\\?[^\\\/:*?"<>|\r\n] \\?) # Relative path
(?:[^\\\/:*?"<>|\r\n] \\)* # Folder
[^\\\/:*?"<>|\r\n]* # File
我正在 PowerShell 中實作它,并且運算式將不區分大小寫。
我想修改這個運算式,使其只匹配包含帶有擴展名的檔案的路徑。我知道檔案可能不包含擴展名 - 我不想匹配這種邊緣情況。
我想要發生的事情的例子:
C:\Applications\Dev\File.txt 比賽
C:\Applications\Dev\ 不匹配
\\192.168.0.1\SHARE\my folder\test.exe 比賽
..\..\bin\my_executable.exe 比賽
等等。
如果有人可以指出我的解決方案,那將有很大幫助!
非常感謝。
編輯:
在聽取了所有人的所有建議后,我最終采用了以下實作:
https://github.com/visusys/VSYSUtility/blob/main/Public/Confirm-WindowsPathIsValid.ps1
也許我的一些 PowerShell 書呆子會發現它很有用。:)
uj5u.com熱心網友回復:
一個實用的解決方案是首先應用您的驗證正則運算式 - 如果路徑匹配 -System.IO.Path.GetExtension()在其上呼叫.NET API 方法:[1]
- 注意:我沒有查看細節,但您的正則運算式也匹配格式錯誤的路徑,例如
C:\foo\C:\bar- follow-up question。
'C:\Applications\Dev\File.txt',
'C:\Applications\Dev\',
'\\192.168.0.1\SHARE\my folder\test.exe',
'..\..\bin\my_executable.exe',
'invalid:path' |
ForEach-Object {
$valid = $_ -match '^(?:(?:[a-z]:|\\\\[a-z0-9_.$●-] \\[a-z0-9_.$●-] )\\|\\?[^\\\/:*?"<>|\r\n] \\?)*(?:[^\\\/:*?"<>|\r\n] \\)*[^\\\/:*?"<>|\r\n]*$'
[pscustomobject] @{
Path = $_
Valid = $valid
HasExtension = if ($valid) { '' -ne [IO.Path]::GetExtension($_) }
}
}
輸出:
Path Valid HasExtension
---- ----- ------------
C:\Applications\Dev\File.txt True True
C:\Applications\Dev\ True False
\\192.168.0.1\SHARE\my folder\test.exe True True
..\..\bin\my_executable.exe True True
invalid:path False
[1] 在 Windows 上,此方法本身執行有限的驗證:包含非法字符(例如"導致例外)的路徑,但不會導致格式錯誤的路徑。在類 Unix 平臺上,檔案系統通常允許路徑中的任何字符,除了NUL,似乎NUL根本不執行任何驗證(即使字符也不會導致例外)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/365902.html
上一篇:如何在nest.js應用程式中驗證RESTAPI上的動態屬性名稱?
下一篇:兩次呼叫函式并每次保存不同的值
