簡體   English   中英

有效文件名的正則表達式

[英]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 .txtfile...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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM