Na przykład, zakładając x = filename.jpg
, że chcę uzyskać filename
, gdzie filename
może być dowolna nazwa pliku (załóżmy, że nazwa pliku zawiera tylko [a-zA-Z0-9-_] w celu uproszczenia.).
Widziałem x.substring(0, x.indexOf('.jpg'))
na fragmentach DZone , ale czy nie działałby x.substring(0, x.length-4)
lepiej? Ponieważ length
jest właściwością i nie sprawdza znaków, podczas gdy indexOf()
jest funkcją i sprawdza znaki.
Odpowiedzi:
Jeśli znasz długość rozszerzenia, możesz użyć
x.slice(0, -4)
(gdzie 4 to trzy znaki rozszerzenia i kropka).Jeśli nie znasz długości, wyrażenie regularne @John Hartsock byłoby właściwym podejściem.
Jeśli wolisz nie używać wyrażeń regularnych, możesz wypróbować to (mniej wydajne):
Pamiętaj, że nie powiedzie się na plikach bez rozszerzenia.
źródło
.jpg
. Szukałem czegoś takiego jak Rubyx[0..-5]
ix.slice(0, -4)
wygląda świetnie! Dzięki! I dziękuję wszystkim innym za wszystkie inne solidne alternatywy!"picture.jpeg".slice(0, -4)
-> „picture”.Nie jestem pewien, co by działało szybciej, ale byłoby to bardziej niezawodne, jeśli chodzi o rozszerzenie, takie jak
.jpeg
lub.html
źródło
W node.js nazwę pliku bez rozszerzenia można uzyskać w następujący sposób.
Dalsze objaśnienia na stronie dokumentacji Node.js.
źródło
var parsed = path.parse(filename)
popath.join(parsed.dir, parsed.name)
.let base = path.basename( file_path, path.extname( file_path ) )
.x.length-4
uwzględnia tylko rozszerzenia 3 znaków. Co jeśli maszfilename.jpeg
lubfilename.pl
?EDYTOWAĆ:
Aby odpowiedzieć ... na pewno, jeśli zawsze masz rozszerzenie
.jpg
,x.length-4
działałoby dobrze.Jeśli jednak nie znasz długości swojego rozszerzenia, dowolne z wielu rozwiązań jest lepsze / bardziej niezawodne.
x = x.replace(/\..+$/, '');
LUB
x = x.substring(0, x.lastIndexOf('.'));
LUB
x = x.replace(/(.*)\.(.*?)$/, "$1");
LUB (przy założeniu, że nazwa pliku ma tylko jedną kropkę)
LUB (także z tylko jedną kropką)
źródło
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('.'));
- prawdopodobnie miałeś na myślix = x.substring(0, x.lastIndexOf('.'));
?Być może możesz przyjąć założenie, że ostatnia kropka będzie ogranicznikiem rozszerzenia.
Jeśli plik nie ma rozszerzenia, zwróci pusty ciąg. Aby to naprawić, użyj tej funkcji
źródło
var f = x.substr(0, x.lastIndexOf('.')) || x;
Działa to, ponieważ pusty ciąg znaków jest fałszem, dlatego zwraca x.Podoba mi się ten, ponieważ jest to jeden liniowiec, który nie jest zbyt trudny do odczytania:
źródło
W wersjach Node.js wcześniejszych niż 0.12.x:
path.basename(filename, path.extname(filename))
Oczywiście działa to również w wersji 0.12.xi późniejszych.
źródło
path.parse
Odpowiedź jest prostsza.Działa to nawet wtedy, gdy ogranicznik nie występuje w ciągu.
Może być również użyty jako jedna linijka:
EDYCJA: To jest bardziej wydajne rozwiązanie:
źródło
Nie wiem, czy jest to prawidłowa opcja, ale używam tego:
Wiem, że to nie tylko jedna operacja, ale przynajmniej powinna zawsze działać!
AKTUALIZACJA: Jeśli chcesz oneliner, oto jesteś:
(name.split('.').slice(0, -1)).join('.')
źródło
hello.name.txt
wracahello, name
Kolejna linijka:
źródło
Oto inne rozwiązanie oparte na wyrażeniach regularnych:
To powinno odciąć tylko ostatni segment.
źródło
Prosty:
źródło
Zaakceptowana odpowiedź usuwa tylko ostatnią część rozszerzenia (
.jpeg
), co może być dobrym wyborem w większości przypadków.Kiedyś musiałem usunąć wszystkie rozszerzenia (
.tar.gz
), a nazwy plików były ograniczone, aby nie zawierały kropek (więc2015-01-01.backup.tar
nie byłoby problemu):źródło
źródło
path/name.ext
->paht/name
zamiast po prostu wracaćname
, ale wolałabym zrobić z,fs.parse
choć jest to nieco bardziej szczegółowe: stackoverflow.com/a/59576950/895245Jeśli musisz przetworzyć zmienną zawierającą pełną ścieżkę (np .:)
thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg"
i chcesz zwrócić tylko „nazwę pliku”, możesz użyć:wynikiem będzie nazwa == "nazwa pliku" ;
Aby spróbować, wpisz następującą komendę w oknie konsoli debuggera chrome:
window.location.pathname.split("/").slice(-1).join().split(".").shift()
Jeśli musisz przetworzyć tylko nazwę pliku i jego rozszerzenie (np .:)
theNameWithExt = "filename.jpg"
:wynikiem będzie nazwa == „nazwa pliku” , taka sama jak powyżej;
Uwagi:
Ale nie mogę powiedzieć nic o porównaniu wydajności z innymi odpowiedziami ani o zgodności przeglądarki lub systemu operacyjnego.
fragment roboczy 1: pełna ścieżka
fragment roboczy 2: nazwa pliku z rozszerzeniem
fragment roboczy 2: nazwa pliku z podwójnym rozszerzeniem
źródło
Chociaż jest dość późno, dodam inne podejście do uzyskania nazwy pliku bez rozszerzenia przy użyciu zwykłego starego JS-
path.replace(path.substr(path.lastIndexOf('.')), '')
źródło
path.split('.').pop()
dla rozszerzeń plików z jedną częściąNode.js usuwa rozszerzenie z katalogu prowadzącego pełną ścieżkę
https://stackoverflow.com/a/31615711/895245 na przykład zrobił
path/hello.html
->hello
, ale jeśli chceszpath/hello.html
->path/hello
, możesz użyć tego:wypisuje również katalog:
https://stackoverflow.com/a/36099196/895245 również to osiąga, ale uważam, że to podejście jest nieco bardziej semantycznie przyjemne.
Testowane w Node.js 10.15.2.
źródło
Tutaj przydają się wyrażenia regularne!
.replace()
Metoda Javascript przyjmuje wyrażenie regularne i możesz go wykorzystać do osiągnięcia tego, co chcesz:źródło
Kolejna linijka - zakładamy, że naszym plikiem jest obraz jpg >> np .: var yourStr = 'test.jpg';
źródło
Możesz użyć
path
do manewru.Wynik
źródło
źródło
To jest kod, którego używam do usunięcia rozszerzenia z nazwy pliku, bez użycia wyrażenia regularnego lub indexOf (indexOf nie jest obsługiwany w IE8). Zakłada się, że rozszerzeniem jest dowolny tekst po ostatnim „.” postać.
Działa dla:
Oto kod:
źródło
hello.tar.gz
, wynikiem jesthellotar
.Chciałbym użyć czegoś takiego jak x.substring (0, x.lastIndexOf ('.')). Jeśli szukasz wydajności, nie używaj javascript :-p Nie, jeszcze jedno zdanie naprawdę nie ma znaczenia dla 99,99999% wszystkich celów.
źródło