2013-03-28 2 views
5

У меня есть список, который содержит имена файлов (без их полного пути)Regex, чтобы получить расширение файла

List<string> list=new List<string>(); 

list.Add("File1.doc"); 
list.Add("File2.pdf"); 
list.Add("File3.xls"); 

foreach(var item in list) { 
    var val=item.Split('.'); 
    var ext=val[1]; 
} 

Я не хочу использовать String.Split, как я получу расширение файла с регулярным выражением ?

+3

Почему бы не использовать Path.GetExtension? Regex перегружается здесь, если вы хотите только расширение. – keyboardP

+0

, чтобы получить правильное значение ext var ext = val [1]; может быть лучше: var ext = val [val.Length-1]; ваш текущий код имеет лучшую производительность как регулярное выражение или любой другой метод, если вы начинаете с строки. – Peter

ответ

4

Вы можете использовать Path.GetExtension().

Пример (также удаляет точку):

string filename = "MyAwesomeFileName.ext"; 
string extension = Path.GetExtension(filename).Replace(".", ""); 

// extension now contains "ext" 
+0

У меня нет полного пути к файлу. – 2013-03-28 12:18:18

+4

Вам это не нужно. – vanneto

13

Вам не нужно использовать регулярное выражение для этого. Вы можете использовать метод Path.GetExtension.

Возвращает расширение указанной строки пути.

string name = "notepad.exe"; 
string ext = Path.GetExtension(name).Replace(".", ""); // exe 

Вот DEMO.

0

"\. [^ \.] +" Соответствует любому, что начинается с '.' символ, за которым следует 1 или более нет. персонажи.

Кстати, другие правы, regex overkill здесь.

2

регулярное выражение

\.([A-Za-z0-9]+)$ 

Сбежал период, 1 или более буквенно-цифровых символов, конец строки


Вы также можете использовать LastIndexOf ("")

int delim = fileName.LastIndexOf("."); 
string ext = fileName.Substring(delim >= 0 ? delim : 0); 

Но используя встроенную функцию i всегда удобнее.

3

Чтобы получить расширение с помощью регулярных выражений:

foreach (var item in list) { 
    var ext = Regex.Match(item, "[^.]+$").Value; 
} 

Или, если вы хотите, чтобы убедиться, что есть точка:

@"(?<=\.)[^.]+$" 
0

В пользу Googlers -

Я имел дело с причудливыми именами файлов, например FirstPart.SecondPart.xml, причем расширение неизвестно.

В этом случае Path.GetFileExtension() запутался в дополнительных точках.

Регулярного выражения я использовал

\.[A-z]{3,4}$ 

т.е. соответствует последнему экземпляру 3 или 4 символа с точкой в ​​только спереди. Вы можете проверить его здесь на Regexr. Не победитель приза, но сделал трюк.

Очевидным недостатком является то, что если вторая часть была 3-4 символа, и файл не имел расширения, он бы взял это, однако я знал, что это не та ситуация, с которой я столкнулся.

Смежные вопросы