[英]Regular expression for valid filename
我已經在 StackOverflow 中解決了一些關於此問題的問題,但對我來說沒有什么幫助。
我想限制用戶提供的文件名只能包含字母數字字符-
、 _
、 .
和空間。
我不擅長正則表達式,到目前為止我想出了這個^[a-zA-Z0-9.-_]$
。 有人可以幫助我嗎?
這是正確的表達方式:
string regex = @"^[\w\-. ]+$";
\w
相當於[0-9a-zA-Z_]
。
要驗證文件名,我建議使用 C# 提供的函數而不是正則表達式
if (filename.IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) != -1)
{
}
雖然 OP 要求的內容與當前接受的答案使用的內容( ^[\w\-. ]+$
)接近,但可能還有其他人看到這個問題有更具體的限制。
首先,根據 OP 的限制,在非 US/GB 機器上運行, \w
將允許來自外語的各種不需要的字符。
其次,如果文件擴展名包含在名稱中,這將允許各種看起來很奇怪但有效的文件名,例如file .txt
或file...txt
。
第三,如果您只是將文件上傳到文件系統,您可能需要一個文件和/或擴展名的黑名單,如下所示:
web.config、主機、.gitignore、httpd.conf、.htaccess
但是,這遠遠超出了這個問題的范圍; 它需要有關設置的各種信息,以便在安全問題上提供良好的指導。 我想我還是應該提出這個問題。
因此,對於用戶可以輸入完整文件名的解決方案,我會使用如下內容:
^[a-zA-Z0-9](?:[a-zA-Z0-9 ._-]*[a-zA-Z0-9])?\.[a-zA-Z0-9_-]+$
它確保只使用英文字母,沒有開頭或結尾的空格,並確保使用長度至少為 1 且沒有空格的文件擴展名。
我已經在Regex101上對此進行了測試,但為了將來參考,這是我的“測試套件”:
## THE BELOW SHOULD MATCH
web.config
httpd.conf
test.txt
1.1
my long file name.txt
## THE BELOW SHOULD NOT MATCH - THOUGH VALID
æøå.txt
hosts
.gitignore
.htaccess
如果其他人需要驗證文件名(包括 Windows 保留字等),這里有一個完整的表達式: \A(?!(?:COM[0-9]|CON|LPT[0-9]|NUL|PRN|AUX|com[0-9]|con|lpt[0-9]|nul|prn|aux)|[\s\.])[^\\\/:*"?<>|]{1,254}\z
擴展表達式(不允許以 2 個點開頭的文件名,不允許以點或空格結尾的文件名):
\A(?!(?:COM[0-9]|CON|LPT[0-9]|NUL|PRN|AUX|com[0-9]|con|lpt[0-9]|nul|prn|aux)|\s|[\.]{2,})[^\\\/:*"?<>|]{1,254}(?<![\s\.])\z
編輯:對於感興趣的,這里是 Windows 文件命名約定的鏈接: https ://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx
使用這個正則表達式^[a-zA-Z0-9._ -]+$
這是工程師回答的一個小改動。
string regex = @"^[\w\- ]+[\w\-. ]*$"
這將阻止無效的".txt"
。
麻煩的是,它確實阻止了有效的"..txt"
對於完整字符集 (Unicode),請使用^[\p{L}0-9_\-.~]+$
或者如果我們談論 Unicode,也許^[\p{L}\p{N}_\-.~]+$
會更准確。
我添加了一個“~”只是因為我有一些使用該字符的文件。
我剛剛創建了這個。 它可以防止在結尾和開頭出現兩個點和點。 但它不允許任何兩個點。
^([a-zA-Z0-9_]+)\.(?!\.)([a-zA-Z0-9]{1,5})(?<!\.)$
我可能在這里說一些愚蠢的話,但在我看來,這些答案是不正確的。 首先,我們在這里談論的是 Linux 還是 Windows(或其他操作系統)?
其次,在 Windows 中(我相信)在文件名中包含“$”是完全合法的,更不用說一般的 Unicode。 這似乎當然是可能的。
我試圖獲得關於此的明確來源......並最終出現在Wikip 文件名頁面:特別是“保留的字符和單詞”部分似乎相關:顯然,這些是您不允許的內容列表投放。
我在Java世界。 我很自然地認為 Apache Commons 會有類似validateFilename
的東西,可能在FilenameUtils
中......但它似乎沒有(如果它這樣做了,這對 C# 程序員仍然可能有用,因為代碼通常很容易理解,並且因此可以翻譯)。 不過,我確實做了一個實驗,使用了normalize
方法:令我失望的是,它允許完全無效的字符(?等)“通過”。
上面引用的 Wikip 文件名頁面的部分表明這個問題取決於您使用的操作系統......但至少應該可以為 Linux 和 Windows 編寫一些簡單的正則表達式。
然后我找到了一種Java方式(至少):
Path path = java.nio.file.FileSystems.getDefault().getPath( 'bobb??::mouse.blip' );
輸出:
java.nio.file.InvalidPathException:索引 4 處的非法字符:bobb??::mouse.blip
...大概不同的FileSystem
對象將有不同的驗證規則
當通過pattern
在 HTML5 中使用時:
<form action="" method="POST">
<fieldset>
<legend>Export Configuration</legend>
<label for="file-name">File Name</label>
<input type="text" required pattern="^[\w\-. ]+$" id="file-name" name="file_name"/>
</fieldset>
<button type="submit">Export Settings</button>
</form>
這將針對所有有效的文件名進行驗證。 您可以刪除required
以防止本機 HTML5 驗證。
從@Engineer 復制以供將來參考,因為點在投票最多的答案中沒有被轉義(應該如此)。
這是正確的表達方式:
string regex = @"^[\w\-\. ]+$";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.