匹配单个Regex的文件名和文件扩展名

时间:2012-01-25 10:58:38

标签: javascript jquery 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]);
}

上面的函数工作正常,但我确信必须能够通过引用使用.match()方法返回的数组的不同部分来实现单个正则表达式。我试过结合这些正则表达式但没有成功。

另外,我在示例中没有使用字符串来测试它,因为console.log()会转义文件路径中的反斜杠而且它开始让我迷惑:)

7 个答案:

答案 0 :(得分:7)

假设所有文件都有扩展名,您可以使用

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

然后你可以做

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

答案 1 :(得分:6)

在第一组是您的文件名后,

/^.*\/(.*)\.?(.*)$/g,第二组是扩展名。

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

即使你的文件名包含多于一个点或根本不包含点(无延伸),这也有效。
修改
这是针对linux的,对于windows使用这个/^.*\\(.*)\.?(.*)$/g(在windows目录中的分隔符是/,在windows中是\

答案 2 :(得分:5)

您可以在正则表达式中使用组:

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

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

答案 3 :(得分:2)

这甚至可以识别/home/someUser/.aaa/.bb.c

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

答案 4 :(得分:1)

我知道这是一个老问题,但这是另一种解决方案,它可以处理名称中的多个点,也可以处理根本没有扩展名(或者只是'。'的扩展名):
/^(.*?)(\.[^.]*)?$/

一次拿一块:
^
锚定到字符串的开头(以避免部分匹配)

(.*?)
匹配任何字符.,0次或更多次*,懒惰?(如果后面的可选扩展名可以匹配,请不要只抓取所有字符),并将它们放在第一个捕获组中( )

(\.
使用(启动扩展的第二个捕获组。该组以文字.字符开头(我们使用\转义,以便.不会被解释为“匹配任何字符”)。

[^.]*
定义字符集[]。通过指定这是一个反转的字符集^来匹配集合中的字符而不是。匹配0个或更多非.个字符以获取文件扩展名*的其余部分。我们以这种方式指定它,使其与foo.bar.baz等文件名的早期版本不匹配,错误地为.bar.baz中的多个点添加了一个扩展名,而不仅仅是.baz.内部[]不需要转义,因为所有内容(^除外)都是字符集中的文字。

)?
结束第二个捕获组)并指出整个组是可选的?,因为它可能没有扩展名。

$
锚定到字符串的末尾(同样,以避免部分匹配)

如果你正在使用ES6,你甚至可以使用destruct在1行中获取结果:
[,filename, extension] = /^(.*?)(\.[^.]*)?$/.exec('foo.bar.baz'); 其中文件名为'foo.bar',扩展名为'.baz' 'foo'给出'foo' and ''
'foo.'代表'foo''.' '.js'代码为'''.js'

答案 5 :(得分:0)

我认为这是一种更好的方法,因为只匹配有效的目录,文件名和扩展名。并且还对路径,文件名和文件扩展名进行分组。并且只使用空路径文件名。

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

测试用例

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

输出

[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]

答案 6 :(得分:0)

(?!\w+).(\w+)(\s)

找到一个或多个单词\w+,取反(?! ),以使单词不显示在结果中,指定定界符.,找到第一个单词(\w+)并忽略可能的空格(\s)

之后的单词