2014-10-07 179 views
0

一切,我有一個包含以下內容的有效載荷:正則表達式匹配除字符

\帕特里克-TES t - f i l e . t x t x SMB2

我正在尋找patrick-test-file.txt的文件名

我可以通過這種緊密的,但它仍然包含一切(包括ASCII字符)

[\\\\](.*?)x�SMB2 

結果如下: p a t r i c k - t e s t - f i l e . t x t 爲捕獲組。

我該如何匹配文件名的字符,可以是任意長度的字符,也可以包含字母數字字符?這是可能的純正則表達式?

任何幫助,非常感謝。

+0

您可以使用字符組:「[^ \ w \ d。] +'並將其替換爲」無「? [Regex101.com](http://regex101.com/r/tR8dX0/1)或[this](http://regex101.com/r/tR8dX0/2)。 (編輯:我猜'\ w'和'\ d'都是多餘的)。 – OnlineCop 2014-10-07 20:33:29

+0

哪種語言?哪個正則表達式引擎? – revo 2014-10-07 20:36:13

+0

@OnlineCop我看到用什麼都替換它的問題,但我認爲用'$ 1'替換'[^ - \ w。\\]([ - \ w。\\])''是個好主意,部分分離(文件名和那個SMB2結尾),然後字符串解析其餘部分。 – Suamere 2014-10-07 21:14:36

回答

0

有時,你只是不能做一個語言不可知的正則表達式來完成某件事情。有時(通常),執行一系列字符串函數會更高效。

我不會親自接受任何具有硬編碼值的解決方案,例如x�SMB2

如果只想使用正則表達式,可以先選擇文件名部分,如下所示:(([-\w\d.\\]+)[^-\w\d.\\]?)+,然後繼續並用[^-\w\d.\\]替換爲""

老實說,在有限的細節,最好的功能,像這樣:

var fileName = "\patrick-test-file.txt"; 

但半玩笑歸玩笑,並與有限的細節,最好的辦法是做了幾個字符串函數:

var yuckyString = @"����\�p�a�t�r�i�c�k�-�t�e�s�t�-�f�i�l�e�.�t�x�t������x�SMB2"; 
var fileNameArea = yuckyString.Split(new[] { "��" }, StringSplitOptions.RemoveEmptyEntries)[0]; 
var fileName = fileNameArea.Replace("�", ""); 

當然,沒有語言列出,所以我使用的是C#。此外,如果這些特殊字符出現不正常情況,答案也會改變。有限的信息,模式似乎很清楚。