我正在尝试创建一个Javascript Regex,它捕获没有文件扩展名的文件名。我在这里阅读了其他帖子并'转到此页面: http://gunblad3.blogspot.com/2008/05/uri-url-parsing.html'似乎是默认答案。这似乎不适合我。所以这就是我试图让正则表达式工作的方式:
我能得到的最接近的是: /([^ /] )。\ w $ 字符串'http://example.com/index.htm'< / strong> exec()将捕获 /index.htm 和索引。
我需要这个才能捕获 index 。
答案 0 :(得分:40)
var url = "http://example.com/index.htm";
var filename = url.match(/([^\/]+)(?=\.\w+$)/)[0];
让我们看一下正则表达式:
[^\/]+ # one or more character that isn't a slash
(?= # open a positive lookahead assertion
\. # a literal dot character
\w+ # one or more word characters
$ # end of string boundary
) # end of the lookahead
此表达式将收集所有不是斜杠的字符(由于lookahead)通过扩展名和字符串的结尾 - 或者换句话说,在最后一个之后的所有内容斜线,直到延长。
或者,您可以在没有正则表达式的情况下执行此操作,方法是使用lastIndexOf
找到最后/
和最后.
的位置,并在这些位置之间获得substring
分:
var url = "http://example.com/index.htm";
var filename = url.substring(url.lastIndexOf("/") + 1, url.lastIndexOf("."));
答案 1 :(得分:17)
测试并运行,即使对于没有文件扩展名的页面也是如此。
var re = /([\w\d_-]*)\.?[^\\\/]*$/i;
var url = "http://stackoverflow.com/questions/3671522/regex-capture-filename-from-url-without-file-extention";
alert(url.match(re)[1]); // 'regex-capture-filename-from-url-without-file-extention'
url = 'http://gunblad3.blogspot.com/2008/05/uri-url-parsing.html';
alert(url.match(re)[1]); // 'uri-url-parsing'
([\w\d_-]*)
获取包含字母,数字,下划线或连字符的字符串
\.?
或许字符串后跟一段时间
[^\\\/]*$
但是直到最后才会出现斜线或反斜杠
/i
哦,是的,无视案例。
答案 2 :(得分:1)
你可以试试这个正则表达式:
([^/]*)\.[^.]*$
答案 3 :(得分:1)
我没有发现任何答案足够强大。这是我的解决方案。
function getFileName(url, includeExtension) {
var matches = url && typeof url.match === "function" && url.match(/\/?([^/.]*)\.?([^/]*)$/);
if (!matches)
return null;
if (includeExtension && matches.length > 2 && matches[2]) {
return matches.slice(1).join(".");
}
return matches[1];
}
var url = "http://example.com/index.htm";
var filename = getFileName(url);
// index
filename = getFileName(url, true);
// index.htm
url = "index.htm";
filename = getFileName(url);
// index
filename = getFileName(url, true);
// index.htm
// BGerrissen's examples
url = "http://stackoverflow.com/questions/3671522/regex-capture-filename-from-url-without-file-extention";
filename = getFileName(url);
// regex-capture-filename-from-url-without-file-extention
filename = getFileName(url, true);
// regex-capture-filename-from-url-without-file-extention
url = "http://gunblad3.blogspot.com/2008/05/uri-url-parsing.html";
filename = getFileName(url);
// uri-url-parsing
filename = getFileName(url, true);
// uri-url-parsing.html
// BGerrissen fails
url = "http://gunblad3.blogspot.com/2008/05/uri%20url-parsing.html";
filename = getFileName(url);
// uri%20url-parsing
filename = getFileName(url, true);
// uri%20url-parsing.html
// George Pantazis multiple dots
url = "http://gunblad3.blogspot.com/2008/05/foo.global.js";
filename = getFileName(url);
// foo
filename = getFileName(url, true);
// foo.global.js
// Fringe cases
url = {};
filename = getFileName(url);
// null
url = null;
filename = getFileName(url);
// null
要符合原始问题,默认行为是排除扩展名,但可以轻松撤消。
答案 4 :(得分:0)
尝试此正则表达式。它甚至可以处理多个句点的文件名。
(?<=\/)[^\/]*(?=\.\w+$)