使用正则表达式提取文件名而无需扩展名的url

时间:2018-07-20 21:02:04

标签: javascript json regex

我有这两个不同的网址

https://www.examplecom/dir/dir1/filename
https://www.example.com/dir/dir1/filename?start=83477&index=2

,并且想提取filename而不使用后备正则表达式,因为我计划在JSON脚本中使用它。

/[^/]*$/是我到目前为止所拥有的,但是它仅适用于第一个URL。

3 个答案:

答案 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);
}