2012-01-25 11 views
6

Jestem pewien, że to musi być na tyle łatwe, ale jestem walczą ...filename Mecz i rozszerzenie pliku z pojedynczym Regex

var regexFileName = /[^\\]*$/; // match filename 
var regexFileExtension = /(\w+)$/; // match file extension 

function displayUpload() { 
    var path = $el.val(); //This is a file input 
    var filename = path.match(regexFileName); // returns file name 
    var extension = filename[0].match(regexFileExtension); // returns extension 

    console.log("The filename is " + filename[0]); 
    console.log("The extension is " + extension[0]); 
} 

Powyższa funkcja działa poprawnie, ale jestem pewien, że to musi być możliwe do osiągnięcia za pomocą pojedynczego wyrażenia regularnego, poprzez odniesienie do różnych części tablicy zwróconej za pomocą metody .match(). Próbowałem połączyć te regex, ale bez powodzenia.

Również nie używam ciąg przetestować go na na przykład, jak console.log() ucieka ukośniki w A filePath i to rozpoczynało się mylić mnie :) Po tym pierwszym

Odpowiedz

5

Zakładając, że wszystkie pliki mają rozszerzenia, można użyć

var regexAll = /[^\\]*\.(\w+)$/; 

Następnie można zrobić

var total = path.match(regexAll); 
var filename = total[0]; 
var extension = total[1]; 
+0

jestem bardziej .net regex facetem, ale nie są brakuje ci pierwszej grupy przechwytującej? – rtpHarry

+0

@rtpHarry: Całe dopasowanie (grupa 0) to nazwa pliku (wraz z rozszerzeniem), pierwsza grupa przechwytywania (grupa 1) jest rozszerzeniem. –

+0

Potrzebuje nazwy pliku, a nie całej ścieżki. – shift66

6

/^.*\/(.*)\.?(.*)$/g grupa to nazwa pliku, a druga grupa to rozszerzenie.

var myString = "filePath/long/path/myfile.even.with.dotes.TXT"; 
var myRegexp = /^.*\/(.*)\.(.*)$/g; 
var match = myRegexp.exec(myString); 
alert(match[1]); // myfile.even.with.dotes 
alert(match[2]); // TXT 

Działa to, nawet jeśli nazwa pliku zawiera więcej niż jedną kropkę lub nie zawiera kropek (bez rozszerzenia).
EDIT:
To jest dla systemów Linux, okien używać tego /^.*\\(.*)\.?(.*)$/g (w Linuksie separator katalogu jest / w oknach jest \)

+0

To nie z ' '/ tmp/myFile.txt'' – DelightedD0D

2

można używać grup w yo dla wyrażenia regularnego:

var regex = /^([^\\]*)\.(\w+)$/; 
var matches = filename.match(regex); 

if (matches) { 
    var filename = matches[1]; 
    var extension = matches[2]; 
} 
+0

Jestem bardziej facetem .net regex, ale czy nie tęsknisz za pierwszą grupą przechwytującą? – rtpHarry

+0

Masz rację. Właśnie to przetestowałem, dokumentacja była nieco myląca: P – fivedigit

+0

Twój kod był poprawny przed i jest teraz uszkodzony. Skąd się bierze "mecze [2]", jeśli masz tylko jedną grupę przechwytującą? –

0

Myślę, że jest to lepsze podejście, ponieważ dopasowuje tylko prawidłowy katalog, nazwy plików i rozszerzenie. a także grupuje ścieżkę, nazwę pliku i rozszerzenie pliku. Działa również z pustymi ścieżkami tylko nazwa pliku.

^([\w\/]*?)([\w\.]*)\.(\w)$ 

przypadki testowe

the/p0090Aath/fav.min.icon.png 
the/p0090Aath/fav.min.icon.html 
the/p009_0Aath/fav.m45in.icon.css 
fav.m45in.icon.css 
favicon.ico 

Wyjście

[the/p0090Aath/][fav.min.icon][png] 
[the/p0090Aath/][fav.min.icon][html] 
[the/p009_0Aath/][fav.m45in.icon][css] 
[][fav.m45in.icon][css] 
[][favicon][ico] 
2

ten rozpozna nawet /home/someUser/.aaa/.bb.c:

function splitPathFileExtension(path){ 
    var parsed = path.match(/^(.*\/)(.*)\.(.*)$/); 
    return [parsed[1], parsed[2], parsed[3]]; 
} 
0

wiem, że to jest stare pytanie, ale tutaj jest inne rozwiązanie, które może obsługiwać wiele kropek w nazwie, a także wtedy, gdy nie ma przedłużenie w ogóle (lub przedłużeniem prostu „”):
/^(.*?)(\.[^.]*)?$/

Biorąc to kawałek na raz:
^
Odnośnik do początku łańcucha (aby uniknąć częściowych dopasowań)

(.*?)
dowolny znak ., 0 lub więcej razy * leniwie ? (nie tylko chwycić je wszystkie jeśli później opcjonalne rozszerzenie może się równać) i umieścić je w pierwsza grupa przechwytująca: (.

(\.
Rozpocznij drugą grupę przechwytywania dla rozszerzenia za pomocą (. Ta grupa zaczyna się od literalnego znaku . (którym uciekamy z \, więc . nie jest interpretowane jako "dopasuj dowolny znak").

[^.]*
Definiowanie zestawu znaków []. Dopasuj znaki nie w zestawie, określając to jest odwrócony zestaw znaków ^. Dopasuj 0 lub więcej znaków innych niż ., aby uzyskać pozostałą część rozszerzenia pliku *. Podajemy ją tak, aby nie pasowała do wcześniejszych nazw plików, takich jak foo.bar.baz, niepoprawnie podając rozszerzenie z więcej niż jedną kropką w nim o numerze .bar.baz, zamiast tylko .baz. . nie potrzebuje ucieczki wewnątrz [], ponieważ wszystko (oprócz ^) jest literałem w zestawie znaków.

)?
Zakończyć 2 grupa przechwytywania ) i wskazują, że cała grupa jest opcjonalna ?, ponieważ nie może mieć rozszerzenie.

$
Anchor na końcu łańcucha (ponownie, aby uniknąć częściowych dopasowań)

Jeśli używasz ES6 można nawet użyć destructing chwycić wyniki w 1 linii:
[,filename, extension] = /^(.*?)(\.[^.]*)?$/.exec('foo.bar.baz'); który podaje nazwę pliku jako 'foo.bar' i rozszerzenie jako '.baz'.
'foo' daje 'foo' and ''
'foo.' daje 'foo' i '.'
'.js' daje '' i '.js'