我确信这一定很容易,但我正在努力......
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()会转义文件路径中的反斜杠而且它开始让我迷惑:)
答案 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)