Регулярное выражение для удаления расширения файла - PullRequest
32 голосов
/ 30 ноября 2009

Мне нужно регулярное выражение, которое может удалить расширение имени файла, возвращая только имя файла.

Вот несколько примеров входов и выходов:

myfile.png     -> myfile
myfile.png.jpg -> myfile.png

Я, очевидно, могу сделать это вручную (т.е. удалить все из последней точки), но я уверен, что есть регулярное выражение, которое может сделать это само.

Просто для записи, я делаю это в JavaScript

Ответы [ 9 ]

80 голосов
/ 30 ноября 2009

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

var input = 'myfile.png';
var output = input.substr(0, input.lastIndexOf('.')) || input;

|| input заботится о случае, где lastIndexOf() обеспечивает -1. Видите ли, это все еще однострочник.

38 голосов
/ 30 ноября 2009
/(.*)\.[^.]+$/

Результат будет в этой первой группе захвата. Однако, вероятно, более эффективно просто найти позицию самого правого периода и затем взять все до него, не используя регулярное выражение.

11 голосов
/ 30 ноября 2009
/^(.+)(\.[^ .]+)?$/

Тестовые случаи, когда это работает, а другие терпят неудачу:

  • ". Htaccess" (ведущий период)
  • "файл" (без расширения файла)
  • "отправить миссис" (без расширения, но заканчивается на сокращ.)
  • "версия 1.2 проекта" (без расширения, но все еще содержит точку)

Общий поток выше - это, конечно, «неправильные» расширения файлов. Но вы всегда должны думать об этих угловых случаях. : P

Тестовые случаи, когда это не удается:

  • «версия 1.2» (без расширения файла, но «кажется», чтобы иметь его)
  • "name.tar.gz" (если вы рассматриваете это как "составное расширение" и хотите, чтобы оно разделялось на "name" и ".tar.gz")

Как с ними справиться, проблематично и лучше всего решать в зависимости от проекта.

5 голосов
/ 30 ноября 2009

Регулярное выражение для соответствия шаблону:

/\.[^.]*$/

Находит символ точки ( \. ), за которым следуют 0 или более символов, которые не являются точками ( [^.] *), за которыми следует конец строки ( $ ).

console.log( 
  "aaa.bbb.ccc".replace(/\.[^.]*$/,'')
)
4 голосов
/ 30 августа 2013
/^(.+)(\.[^ .]+)?$/

Указанный выше шаблон неверен - он всегда будет также включать расширение. Это из-за того, как работает механизм регулярных выражений javascript. Маркер (\.[^ .]+) является необязательным, поэтому движок успешно сопоставит всю строку с (.+) http://cl.ly/image/3G1I3h3M2Q0M


Вот мое проверенное решение регулярных выражений.

Шаблон будет соответствовать filenameNoExt с / без расширения в пути, соблюдая разделители как косой, так и обратной косой черты

var path = "c:\some.path/subfolder/file.ext"
var m = path.match(/([^:\\/]*?)(?:\.([^ :\\/.]*))?$/)
var fileName = (m === null)? "" : m[0]
var fileExt  = (m === null)? "" : m[1]

рассечение вышеуказанного рисунка:

([^:\\/]*?)  // match any character, except slashes and colon, 0-or-more times,
             // make the token non-greedy so that the regex engine
             // will try to match the next token (the file extension)
             // capture the file name token to subpattern \1

(?:\.        // match the '.' but don't capture it
([^ :\\/.]*) // match file extension
             // ensure that the last element of the path is matched by prohibiting slashes
             // capture the file extension token to subpattern \2
)?$          // the whole file extension is optional

http://cl.ly/image/3t3N413g3K09

http://www.gethifi.com/tools/regex

Это будет охватывать все случаи, которые были упомянуты @RogerPate, но также включают полные пути

3 голосов
/ 01 декабря 2016

другой способ сделать это без регулярных выражений («опозит» версии @ Rahul, не использующий pop () для удаления)

Не требуется ссылаться на переменную дважды, поэтому проще встроить

filename.split('.').slice(0,-1).join()
0 голосов
/ 23 ноября 2013
  return filename.split('.').pop();

это сделает ваше желание сбудется. Но не с помощью регулярных выражений.

0 голосов
/ 30 ноября 2009

Это тоже будет сделано:)

'myfile.png.jpg'.split('.').reverse().slice(1).reverse().join('.');

Хотя я бы придерживался регулярного выражения ... = P

0 голосов
/ 30 ноября 2009

В javascript вы можете вызвать метод Replace (), который заменит на основе регулярного выражения.

Это регулярное выражение будет соответствовать всему от начала строки до конца и удалять все после последнего периода, включая период.

/^(.*)\..*$/

Как реализовать замену можно найти в этом вопросе Stackoverflow.

Javascript regex question

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...