Por exemplo, supondo que x = filename.jpg
, eu quero obter filename
, onde filename
poderia haver qualquer nome de arquivo (suponha que o nome do arquivo contenha apenas [a-zA-Z0-9-_] para simplificar).
Vi x.substring(0, x.indexOf('.jpg'))
no DZone Snippets , mas não teria um x.substring(0, x.length-4)
desempenho melhor? Porque, length
é uma propriedade e não realiza a verificação de caracteres, enquanto indexOf()
é uma função e realiza a verificação de caracteres.
Respostas:
Se você souber o comprimento da extensão, poderá usar
x.slice(0, -4)
(onde 4 são os três caracteres da extensão e o ponto).Se você não souber o comprimento, a regex @John Hartsock seria a abordagem certa.
Se você preferir não usar expressões regulares, tente isso (menos desempenho):
Observe que ele falhará nos arquivos sem extensão.
fonte
.jpg
. Eu estava procurando por algo como o Rubyx[0..-5]
, ex.slice(0, -4)
está ótimo! Obrigado! E obrigado a todos por todas as outras alternativas robustas fornecidas!"picture.jpeg".slice(0, -4)
-> "imagem".Não tenho certeza do que teria um desempenho mais rápido, mas isso seria mais confiável quando se trata de extensões como
.jpeg
ou.html
fonte
No node.js , o nome do arquivo sem a extensão pode ser obtido da seguinte maneira.
Mais explicações na página de documentação do Node.js.
fonte
var parsed = path.parse(filename)
siga-opath.join(parsed.dir, parsed.name)
.let base = path.basename( file_path, path.extname( file_path ) )
.x.length-4
representa apenas extensões de 3 caracteres. E se você tiverfilename.jpeg
oufilename.pl
?EDITAR:
Para responder ... claro, se você sempre tiver uma extensão de
.jpg
,x.length-4
funcionaria muito bem.No entanto, se você não souber o tamanho da sua extensão, qualquer uma de várias soluções será melhor / mais robusta.
x = x.replace(/\..+$/, '');
OU
x = x.substring(0, x.lastIndexOf('.'));
OU
x = x.replace(/(.*)\.(.*?)$/, "$1");
OU (com o nome do arquivo suposto apenas com um ponto)
OU (também com apenas um ponto)
fonte
var parts = full_file.split("."); var ext = parts[parts.length-1]; var file = parts.splice(0,parts.length-1).join(".");
x = x.substr(0, x.lastIndexOf('.'));
- você provavelmente quis dizerx = x.substring(0, x.lastIndexOf('.'));
?Talvez você possa usar a suposição de que o último ponto será o delimitador de extensão.
Se o arquivo não tiver extensão, ele retornará uma string vazia. Para corrigir isso, use esta função
fonte
var f = x.substr(0, x.lastIndexOf('.')) || x;
Isso funciona porque uma string vazia é falsa e, portanto, retorna x.Eu gosto deste porque é um liner que não é muito difícil de ler:
fonte
Nas versões do Node.js anteriores à 0.12.x:
path.basename(filename, path.extname(filename))
Obviamente, isso também funciona em 0.12.xe posterior.
fonte
path.parse
resposta é mais simples.Isso funciona, mesmo quando o delimitador não está presente na string.
Também pode ser usado como uma linha como esta:
EDIT: Esta é uma solução mais eficiente:
fonte
Não sei se é uma opção válida, mas uso isso:
Não é apenas uma operação que eu conheço, mas pelo menos deve sempre funcionar!
ATUALIZAÇÃO: Se você deseja um oneliner, aqui está:
(name.split('.').slice(0, -1)).join('.')
fonte
hello.name.txt
retornoshello, name
Outra linha:
fonte
Aqui está outra solução baseada em regex:
Isso deve cortar apenas o último segmento.
fonte
Simples:
fonte
A resposta aceita retira apenas a última parte da extensão (
.jpeg
), que pode ser uma boa escolha na maioria dos casos.Uma vez tive que remover todas as extensões (
.tar.gz
) e os nomes dos arquivos foram restritos para não conter pontos (por2015-01-01.backup.tar
isso não seria um problema):fonte
fonte
path/name.ext
-> empaht/name
vez de retornarname
, mas eu prefiro continuar com,fs.parse
embora seja um pouco mais detalhado: stackoverflow.com/a/59576950/895245Se você precisar processar uma variável que contenha o caminho completo (ex .:)
thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg"
e desejar retornar apenas "nome do arquivo", poderá usar:o resultado será theName == "filename" ;
Para tentar, escreva o seguinte comando na janela do console do seu depurador chrome:
window.location.pathname.split("/").slice(-1).join().split(".").shift()
Se você precisar processar apenas o nome do arquivo e sua extensão (ex .:)
theNameWithExt = "filename.jpg"
:o resultado será theName == "filename" , o mesmo que acima;
Notas:
Mas não posso dizer nada sobre a comparação de desempenhos com outras respostas, nem sobre a compatibilidade do navegador ou do SO.
trecho de trabalho 1: o caminho completo
trecho de trabalho 2: o nome do arquivo com extensão
trecho de trabalho 2: o nome do arquivo com extensão dupla
fonte
Embora seja muito tarde, adicionarei outra abordagem para obter o nome do arquivo sem extensão, usando JS-
path.replace(path.substr(path.lastIndexOf('.')), '')
fonte
path.split('.').pop()
para extensões de arquivo de uma parteO Node.js remove a extensão do diretório de manutenção de caminho completo
https://stackoverflow.com/a/31615711/895245, por exemplo, fez
path/hello.html
->hello
, mas se você quiserpath/hello.html
->path/hello
, pode usar isso:diretório de saídas também:
https://stackoverflow.com/a/36099196/895245 também consegue isso, mas acho essa abordagem um pouco mais semanticamente agradável.
Testado no Node.js v10.15.2.
fonte
É aqui que as expressões regulares são úteis! O
.replace()
método do Javascript terá uma expressão regular, e você pode utilizá-lo para realizar o que deseja:fonte
Outro liner - presumimos que nosso arquivo seja uma imagem jpg >> ex: var yourStr = 'test.jpg';
fonte
Você pode usar
path
para manobrar.Resultado
fonte
fonte
Este é o código que eu uso para remover a extensão de um nome de arquivo, sem usar regex ou indexOf (indexOf não é suportado no IE8). Pressupõe que a extensão seja qualquer texto após o último '.' personagem.
Funciona para:
Aqui está o código:
fonte
hello.tar.gz
, a saída éhellotar
.Eu usaria algo como x.substring (0, x.lastIndexOf ('.')). Se você deseja desempenho, não use javascript :-p Não, mais uma declaração realmente não importa para 99,99999% de todos os propósitos.
fonte