2014-10-07 178 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#。此外,如果这些特殊字符出现不正常情况,答案也会改变。有限的信息,模式似乎很清楚。