2014-02-18 10 views
0

У меня есть список имен файлов, какОтрезать расширение имени файла

index.min.html 
index.dev.html 
index.min.js 
index.dev.js 
There.are.also.files.with.multiple.dots.and.other.extension 

Я хочу отрезать расширение имен файлов, но проблема в том, что я могу использовать только match для выполнения этой задачи.

Я пробовал много регулярных выражений, выглядящих как "index.min.html".match(/^((?!:(\.[^\.]+$)).+)/gi);, чтобы выбрать имя файла без последней точки и расширения, но они выбрали либо имя файла отверстия, ни ничего, либо часть перед первой точкой. Есть ли способ выбрать только имя файла без расширения?

+0

Можете ли вы объяснить, почему вы должны использовать 'match'? – marionebl

ответ

8

Почему regex? Простые выражения подстроки сделать это намного проще:

var filename = 'index.something.js.html'; 

alert(filename.substr(0, filename.lastIndexOf("."))); 
3

я бы на

/(.+)\..+$/mi 

demo @ regex101

Смотрите демо, особенно матчи. Он дает вам имя файла без последних . и персонажей впоследствии.

+0

Это работает, но когда я использую 'foo.bar.something.else '.match (/(.+)\..+$/ mi);', он должен возвращать имя файла без расширения – Cubinator73

+0

@ Cubinator73 это не возможно с регулярными выражениями. 'match'-method всегда будет возвращать совпадение ... хорошо ... Для вашего сценария вам всегда нужно ** совместить ** полное имя и ** захватить ** интересную часть. Таким образом, имя файла без расширения просто содержится в группе захвата, к которой вы можете получить доступ в матче. Когда вы запускаете совпадение, отправленное в браузере, вы увидите, что 'match [1]' - это часть, которую вы хотите получить (' foo.bar.something'). 'match [0]' всегда совпадает со всем, и каждый 'index> 0' - это группы захвата. –

3

Как об этом один: (.*)\.[^\.]+ См http://regex101.com/r/xI6qM0

+0

Это тоже работает, но, как я уже сказал, Basti M, когда я использую' foo .bar.something.else ".match (/(.*)\.[^\.]+/ gi);', он должен возвращать имя файла без расширения – Cubinator73

1

Более простым решением было бы просто отрежет последний элемент:

var a = "index.min.html"; 
var b = a.split('.').slice(0, -1).join('.'); 

Or , еще лучше, используя функцию строкой JavaScript substr:

var b = a.substr(0, a.lastIndexOf(".")); 

Почему у вас естьmatch?

+1

. Это работает отлично. Падди короче, но спасибо.:) – Cubinator73

0

Могли бы сделать трюк, тоже:

function baseName(str) { 
    if (typeof str !== 'string') return; 
    var frags = str.split('.') 
    return frags.splice(0,frags.length-1).join('.');  
} 

Отв: http://repl.it/OvI

JSPerf: http://jsperf.com/string-extension-splits

Результат:

substr является самым быстрым из всех вариантов в этой теме , Престижность другим парням.

+0

Также спасибо :) – Cubinator73

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