Javascript имя файла без расширения
Нужен метод в JavaScript для извлечения имени файла и расширения.
У меня есть несколько Постфиксных блочных вложений, основанных на выражении расширения файла: /^Content-(Disposition|Type).*name\s*=\s*?(.*(\.|=2E)( ade|adp|asp|bas|bat|chm|cmd|com|cpl|crt|dll|exe| hlp|ht[at]| inf|ins|isp|jse?|lnk|md[betw]|ms[cipt]|nws|.
Вы можете использовать функцию split() в сочетании с pop() , чтобы получить полное имя файла (имя + расширение) и определить разделение между вашим именем файла и расширением с помощью lastIndexOf() :
Не нужно ничего усложнять. У вас есть метод split(" ") в Javascript, который делает то, что вы хотите.
Я хочу создать скрипт, который переименует файл с 2 расширениями, удалив расширение midle. В связи с этим я нашел эту замечательную нить: Извлеките имя файла и расширение в Bash Кто-то опубликовал там это в отношении расширения параметра shell:
Файл имеет имя файла и расширение, и они обычно пишутся с точкой (полной остановкой) между ними в качестве разделителя. Это описание говорит нам, что точка не является частью расширения, но при указании расширения мы обычно включаем точку. Например, файл PNG с именем файла image обычно.
Короткое решение String.prototype.match() :
расширение var=filename.split (".") [filename.length-1];
Похожие вопросы:
Есть ли функция для извлечения расширения из имени файла?
Я хочу проверить, есть ли в каталоге файлы или нет в bash. Мой код здесь. for d in /etc/bash_completion.d
/.bash/completion.d do [ -d $d ] && [ -n $/* ] && for f in.
У меня есть несколько Постфиксных блочных вложений, основанных на выражении расширения файла: /^Content-(Disposition|Type).*name\s*=\s*?(.*(\.|=2E)( ade|adp|asp|bas|bat|chm|cmd|com|cpl|crt|dll|exe|.
когда я загружаю файл, моя страница просмотра будет отображать этот файл , например 'thisfile.jpg' как удалить .jpg и все расширения файлов из отображаемого имени файла? я попытался пойти к.
Я хочу создать скрипт, который переименует файл с 2 расширениями, удалив расширение midle. В связи с этим я нашел эту замечательную нить: Извлеките имя файла и расширение в Bash Кто-то опубликовал.
Файл имеет имя файла и расширение, и они обычно пишутся с точкой (полной остановкой) между ними в качестве разделителя. Это описание говорит нам, что точка не является частью расширения, но при.
Например, предполагая, что x = filename.jpg , я хочу получить filename , где filename может быть любым именем файла (Предположим, что имя файла содержит только [a-zA-Z0-9-_ ] чтобы упростить.).
Я видел x.substring(0, x.indexOf('.jpg')) на DZone Snippets, но не смог > выступать лучше? Потому что length является свойством и не выполняет проверку символов, тогда как indexOf() является функцией и выполняет проверку символов.
23 ответа
Если вы знаете длину расширения, вы можете использовать x.slice(0, -4) (где 4 - это три символа расширения и точка).
Если вы не знаете длину, регулярное выражение @John Hartsock было бы правильным подходом.
Если вы не хотите использовать регулярные выражения, вы можете попробовать это (менее производительно):
Обратите внимание, что это не удастся для файлов без расширения.
Еще один вкладыш:
Здесь регулярные выражения пригодятся! Метод .replace() Javascript будет принимать регулярное выражение, и вы можете использовать его для достижения желаемого:
Принятый ответ удаляет только последнюю часть расширения ( .jpg ), что может быть хорошим выбором в большинстве случаев.
Однажды мне пришлось удалить все расширения ( .tar.gz ), а имена файлов были ограничены, чтобы они не содержали точек (поэтому 2015-01-01.backup.tar не будет проблемой):
Вот еще одно решение на основе регулярных выражений:
Это должно только отрубить последний сегмент.
Вы можете использовать path для маневра.
x.length-4 учитывает только расширения из 3 символов. Что если у вас есть filename.jpg или filename.pl ?
Чтобы ответить . конечно, если у вас всегда есть расширение .jpg , x.length-4 будет работать нормально.
Однако, если вы не знаете длину своего расширения, любое из нескольких решений будет лучше / надежнее.
x = x.substring(0, x.lastIndexOf('.'));
ИЛИ (при условии, что имя файла имеет только одну точку)
ИЛИ (также только с одной точкой)
Это код, который я использую для удаления расширения из имени файла, без использования регулярных выражений или indexOf (indexOf не поддерживается в IE8). Предполагается, что расширением является любой текст после последнего '.' персонаж.
- файлы без расширения: "myletter"
- файлы с '.' в названии: "my.letter.txt"
- неизвестная длина расширения файла: "my.letter.html"
Это работает, даже если в строке нет разделителя.
Может также использоваться как однострочный:
РЕДАКТИРОВАТЬ: Это более эффективное решение:
Хотя уже довольно поздно, я добавлю другой подход, чтобы получить имя файла без расширения, используя старый добрый JS-
В node.js имя файла без расширения можно получить следующим образом.
Дальнейшие объяснения на странице документации Node.js .
Node.js удаляет расширение из каталога хранения полного пути
Также выводит каталог:
Протестировано в Node.js v10.15.2.
Если вам нужно обработать переменную, которая содержит полный путь (например, thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg" ), и вы хотите вернуть только «имя файла», вы можете использовать:
Результат будет theName == "filename" ;
Чтобы попробовать это, напишите следующую команду в окне консоли вашего отладчика Chrome: window.location.pathname.split("/").slice(-1).join().split(".").shift()
Если вам нужно обработать только имя файла и его расширение (например: theNameWithExt = "filename.jpg" ):
Результат будет theName == "filename" , такой же, как указано выше;
Примечания:
- Первый немного медленнее, потому что выполняет больше операций; но работает в обоих случаях, другими словами, он может извлечь имя файла без расширения из заданной строки, содержащей путь или имя файла с помощью ex. В то время как второй работает, только если данная переменная содержит имя файла с ext, например filename.ext, но немного быстрее.
- Оба решения работают как с локальными, так и с серверными файлами;
Но я не могу ничего сказать ни о сравнении производительности с другими ответами, ни о совместимости браузера или ОС.
например, предполагая, что x = filename.jpg , Я хочу filename , где filename может быть любое имя файла (предположим, что имя файла содержит только [a-zA-Z0-9-_] для упрощения.).
Я видел x.substring(0, x.indexOf('.jpg')) on DZone Фрагменты, а не x.substring(0, x.length-4) лучше? Потому что, length является свойством и не выполняет проверку символов, тогда как indexOf() - это функция, а не персонаж.
Если вы знаете длину расширения, вы можете использовать x.slice(0, -4) (где 4-это три символа расширения и точки).
Если вы не знаете длину @John hartsock regex будет правильным подходом.
Если вы не хотите использовать регулярные выражения, вы можете попробовать это (медленее):
обратите внимание, что он не будет работать на файлы без расширения.
не уверен, что будет работать быстрее, но это будет более надежным, когда дело доходит до расширения, как .jpg или .html
In узел.js, имя файла без расширения можно получить следующим образом.
дальнейшее объяснение в узел.jsдокументация страница.
x.length-4 учитывает только расширения из 3 символов. Что делать, если у вас есть filename.jpg или filename.pl ?
EDIT:
ответ. конечно, если у вас всегда есть продолжение .jpg , x.length-4 будет работать нормально.
однако, если вы не знаете длину вашего расширения, любое из ряда решений лучше/надежнее.
x = x.replace(/\..+$/, '');
или
x = x.substring(0, x.lastIndexOf('.'));
или
x = x.replace(/(.*)\.(.*?)$/, "");
или (с предположением, что имя файла имеет только одну точку)
или (также только с одной точкой)
В Узел.версии js до 0.12.x:
path.basename(filename, path.extname(filename))
конечно, это также работает в 0.12.х и позже.
это работает, даже если разделитель отсутствует в строке.
можно также использовать как ОДН-вкладыш как это:
EDIT: это более эффективное решение:
Мне нравится этот один, потому что это один лайнер, который не слишком трудно читать:
вот еще одно регулярное выражение на основе решения:
Это должно отрубить только последний сегмент.
Я не знаю, если это допустимый вариант, но я использую это:
Это не просто одна операция, которую я знаю, но, по крайней мере, он должен всегда работать!
принятый ответ удаляет только последнюю часть расширения ( .jpg ), что может быть хорошим выбором в большинстве случаев.
мне однажды пришлось снять все расширения ( .tar.gz ) и имена файлов были ограничены, чтобы не содержать точек (так 2015-01-01.backup.tar не было бы проблемой):
Если вам нужно обработать переменную, содержащую полный путь (например.: thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg" ) и вы хотите вернуть только "имя файла" вы можете использовать:
результат будет theName = = "filename";
чтобы попробовать, напишите следующую команду в окно консоли вашего отладчика chrome: window.location.pathname.split("/").slice(-1).join().split(".").shift()
если вы хотите обработать только имя файла и его расширение (например.: theNameWithExt = "filename.jpg" ):
в результат будет theName = = "filename", то же, что и выше;
Примечания:
- первый немного медленнее причина выполняет больше операций, но работает в обоих случаях, другими словами он может извлечь имя файла без расширения из заданной строки, содержащей путь или имя файла с ex. В то время как второй работает только в том случае, если данная переменная содержит имя файла с ext как filename.доб, но немного быстрее.
- оба решения работают как для локальных, так и для серверных файлов;
хотя это довольно поздно, я добавлю еще один подход, чтобы получить имя файла без расширения, используя старый добрый ИС-
path.replace(path.substr(path.lastIndexOf('.')), '')
вот где регулярные выражения пригодятся! Javascript-это .replace() метод будет принимать регулярное выражение, и вы можете использовать его для выполнения того, что вы хотите:
еще один лайнер-мы предполагаем, что наш файл представляет собой изображение jpg > > ex: var yourStr = 'test.jpg';
можно использовать path для маневра.
выход
Когда мы работаем с файлами на Java, нам часто приходится обрабатывать имена файлов. Например, иногда мы хотим получить имя без расширения из данного имени файла. Другими словами, мы хотим удалить расширение имени файла.
В этом уроке мы обсудим общий способ удаления расширения из имени файла.
2. Сценарии удаления расширения Из имени файла
Когда мы впервые взглянем на него, мы можем подумать, что удаление расширения из имени файла-довольно простая проблема.
Однако, если мы рассмотрим проблему более внимательно, она может оказаться более сложной, чем мы думали.
Прежде всего, давайте посмотрим на типы файлов, которые могут быть:
Далее мы перечислим результаты приведенных выше примеров после удаления расширения(ов):
В этом уроке мы проверим, могут ли служебные методы, предоставляемые Guava и Apache Commons IO, обрабатывать все случаи, перечисленные выше.
Кроме того, мы также обсудим общий способ решения проблемы удаления расширения (или расширений) из данного имени файла.
3. Тестирование библиотеки Гуавы
Начиная с версии 14.0, Guava ввел метод Files.getNameWithoutExtension () . Это позволяет нам легко удалить расширение из данного имени файла.
Чтобы использовать метод утилиты, нам нужно добавить библиотеку Guava в ваш путь к классам. Например, если мы используем Maven в качестве инструмента сборки, мы можем добавить зависимость Guava в ваш pom.xml файл:
Реализация довольно проста. Если имя файла содержит точки, метод сокращает путь от последней точки до конца имени файла. В противном случае, если имя файла не содержит точки, исходное имя файла будет возвращено без каких-либо изменений.
Поэтому метод Guava getNameWithoutExtension() не будет работать для dotfiles без расширения. Давайте напишем тест, чтобы доказать, что:
Когда мы обрабатываем имя файла с несколькими расширениями, этот метод не предоставляет возможности удалить все расширения из имени файла:
4. Тестирование библиотеки ввода-вывода Apache Commons
Как и библиотека Guava, популярная библиотека Apache Commons IO предоставляет метод remove Extension() в классе FilenameUtils для быстрого удаления расширения имени файла.
Прежде чем мы рассмотрим этот метод, давайте добавим зависимость Apache Commons IO в ваш pom.xml :
Реализация аналогична методу Guava getNameWithoutExtension() :
Поэтому метод Apache Commons IO также не будет работать с dotfiles :
Если имя файла имеет несколько расширений, удалить расширение() метод не может удалить все расширения:
5. Удаление расширений Из имени файла
До сих пор мы видели утилиты для удаления расширения из имени файла в двух широко используемых библиотеках. Оба метода довольно удобны и работают по наиболее распространенным причинам.
Однако, с другой стороны, у них есть некоторые недостатки:
Далее, давайте построим метод, чтобы охватить все случаи:
Мы добавили логический параметр удалить все расширения , чтобы предоставить возможность удалить все расширения или только последнее расширение из имени файла.
Основной частью этого метода является шаблон regex . Итак, давайте разберемся, что делает этот регулярное выражение шаблон:
Наконец, давайте напишем несколько методов тестирования, чтобы проверить, работает ли наш метод для всех разных случаев:
6. Заключение
В этой статье мы говорили о том, как удалить расширения из данного имени файла.
Во-первых, мы обсудили различные сценарии удаления расширений.
Далее мы представили методы, предоставляемые двумя широко используемыми библиотеками: Guava и Apache Commons IO. Они довольно удобны и работают для обычных случаев, но не могут работать для dotfiles. Кроме того, они не предоставляют возможность удалить одно расширение или все расширения.
Может кто-нибудь сказать мне, как получить имя файла без расширения? Пример:
Если вы, как и я, предпочли бы использовать некоторый библиотечный код, в котором они, вероятно, подумали обо всех особых случаях, например, что произойдет, если вы передадите ноль или точки в пути, но не в имени файла, вы можете использовать следующее:
Вы также можете использовать FilenameUtils.getBasename для перехода от строки пути к имени файла без расширения. Для тех, кто предпочитает гуаву, он тоже может это сделать . (В настоящее время я лично не очень Хотя Guava и Commons-IO могут предложить немного больше, вы будете удивлены тем, сколько удобных методов уже включено в JDK 7 с java.nio.file.Files и Path - таких как разрешение базовых каталогов, копирование / перемещение файлов в одну строку, получение только имени файла и т. д. @Lan Durkan в настоящее время FilenameUtils.getBaseName с большой буквы NСамый простой способ - использовать регулярное выражение.
Вышеупомянутое выражение удалит последнюю точку, за которой следует один или несколько символов. Вот базовый юнит-тест.
Regex не так прост в использовании, как приведенное выше решение для библиотеки. Это работает, но смотреть на код (без необходимости интерпретировать REGEX) не очевидно, что он делает. / * следующее регулярное выражение также удаляет путь * / "/the/path/name.extension".replaceAll(".*[\\\\]]\\\[^\\.]*$", "") ; Я бы добавил косые черты ко второму классу персонажей, чтобы быть уверенным, что вас не запутает путь, подобный «/foo/bar.x/baz»Смотрите следующую тестовую программу:
Какое расширение foo.tar.gz ? Я понимаю, почему это .tar.gz было бы то, что вы хотели бы. @tchrist, foo.tar.gz это версия gzip, foo.tar так что вы также можете утверждать, что это gz было расширение. Все сводится к тому, как вы определяете расширение. Как вы знаете, имя класса в Java никогда не должно начинаться с маленькой буквы! Если бы это было правилом, язык обеспечил бы его соблюдение. Поскольку это не так, это руководство, как бы сильно оно ни предлагалось. В любом случае, это совершенно не имеет отношения к вопросу и ответу.Вот порядок консолидированного списка по моим предпочтениям.
Использование Apache Commons
Использование Google Guava (если вы уже используете его)
Или используя Core Java
Liferay API
Если ваш проект использует Guava (14.0 или новее), вы можете пойти с Files.getNameWithoutExtension() .
(По сути, то же самое, что и в FilenameUtils.removeExtension() Apache Commons IO, как следует из ответа, получившего наибольшее количество голосов . Просто хотел бы отметить, что Guava делает то же самое. Лично я не хотел добавлять зависимость к Commons, что, по моему мнению, является чем-то вроде реликта) только из-за этого.)
на самом деле это больше похоже на FilenameUtils.getBaseName() на самом деле guava - такая нестабильная библиотека, что я просто избегаю использовать ее везде, где могу. предпочитаю стабильную реликвию, чем эксперименты Гугеля Хорошая информация, но пользователи должны знать о таких случаях, как ".htaccess", где этот метод будет возвращать "".Если вы скачаете исходный код и взгляните на их класс FilenameUtils, вы увидите, что есть много дополнительных утилит, и они справляются с путями Windows и Unix, что прекрасно.
Однако, если вы просто хотите использовать несколько статических утилит для использования с путями в стиле Unix (с разделителем "/"), вы можете найти приведенный ниже код полезным.
removeExtension Метод сохраняет остальную часть пути вместе с именем файла. Существует также аналогичное getExtension .
Простейший способ получить имя из относительного или полного пути - использовать
Читайте также: