2014-10-07 5 views
0

У меня есть полезный груз, который содержит следующее:регулярное выражение, чтобы соответствовать все, кроме характера

\ PATRICK-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) или [это] (http://regex101.com/r/tR8dX0/2). (edit: Я думаю, что оба '\ w' и' \ d' являются избыточными). – OnlineCop

+0

На каком языке? Какой регулярный двигатель? – revo

+0

@OnlineCop Я вижу проблемы с заменой его ничем, но я думаю, что это отличная идея заменить '[^ - \ w. \\] ([- \ w. \\])' с '$ 1', который будет содержать разделение частей (имя файла и окончание x SMB2), а затем строка-анализ остальных. – Suamere

ответ

0

Иногда вы просто не можете сделать одноязычное регулярное выражение для выполнения чего-то. И иногда (обычно) более эффективно выполнять ряд строковых функций.

Я бы лично не принял решение, которое имеет жестко заданные значения, например x�SMB2.

Если вы хотите использовать регулярные выражения только, вы можете сначала выбрать File-Name часть следующим образом: (([-\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#. Кроме того, ответ изменился бы, если бы были нарушения с этими особыми символами. С ограниченной информацией картина кажется ясной.