我有这两个不同的网址
https://www.examplecom/dir/dir1/filename
https://www.example.com/dir/dir1/filename?start=83477&index=2
,并且想提取filename
而不使用后备正则表达式,因为我计划在JSON脚本中使用它。
/[^/]*$/
是我到目前为止所拥有的,但是它仅适用于第一个URL。
答案 0 :(得分:1)
您可以使用
s.match(/([^\/?#]+)(?:[?#].*)?$/)[1]
请参见regex demo。它支持在文件名后跟?
或#
或字符串结尾的情况。
详细信息
([^\/?#]+)
-第1组捕获1个或多个除/
,?
和#
以外的字符(?:[?#].*)?
-?
或#
的可选序列,后跟尽可能多的0个字符$
-字符串的结尾。JS演示:
var strs = ['https://www.examplecom/dir/dir1/filename', 'https://www.example.com/dir/dir1/filename?start=83477&index=2', 'https://www.example.com/dir/dir1/filename#index', 'https://www.examplecom/dir/'];
var rx = /([^\/?#]+)(?:[?#].*)?$/;
for (var s of strs) {
var m = s.match(rx);
if (m) {
console.log(s, "=>", m[1]);
} else {
console.log(s, "=> No match!");
}
}
答案 1 :(得分:1)
由于它是一个 url ,因此您可能要使用URL
及其pathname
,然后简单地split()
,reverse()
数组并获取第一项[0]
。
const url1 = new URL('https://www.example.com/dir/dir1/filename');
const url2 = new URL('https://www.example.com/dir/dir1/filename?start=83477&index=2');
console.log(url1.pathname.split("/").reverse()[0]);
console.log(url2.pathname.split("/").reverse()[0]);
或使用pop()
const url1 = new URL('https://www.example.com/dir/dir1/filename');
const url2 = new URL('https://www.example.com/dir/dir1/filename?start=83477&index=2');
console.log(url1.pathname.split("/").pop());
console.log(url2.pathname.split("/").pop());
答案 2 :(得分:1)
也许是这样的:
var urls=[
'https://www.examplecom/dir/dir1/filename', //only file name
'https://www.example.com/dir/dir1/filename?start=83477&index=2', //with get params
'https://www.example.com/dir/dir1/filename.php?start=83477&index=2' //with extension
];
for(var key in urls){
var url= urls[key];
var file_name_no_ext= url.replace(/\?.*$/,"").replace(/.*\//,"").replace(/\.[^/.]+$/, "");
console.log(file_name_no_ext);
}