javascript查找协议,域,加上src标记中带有regexp的第一个斜杠,替换为空字符串

javascript find protocol, domain, plus first slash with regexp from a src tag, replace with empty string

本文关键字:第一个 regexp 替换 字符串 协议 查找 加上 src javascript      更新时间:2023-09-26

我试图为这项任务构建一个正则表达式,但恐怕我仍然无法直观地理解正则表达式。

问题是正则表达式匹配到字符串中的最后一个斜杠。我希望它在字符串的第一个匹配处停止。

我可怜的regex:尝试

/^http(s?):'/'/.+'/{1}/

测试对象:

http://foo.com/bar/test/foo.jpeg

目标是获得bar/test/foo.jpeg,这样我就可以拆分字符串,弹出最后一个元素,然后连接其余元素,从而获得JavaScript文件的路径。

示例

var str = 'http://foo.com/bar/test/foo.jpeg';
str.replace(regexp,'');

虽然另一个答案显示了如何匹配字符串的一部分,但我认为替换解决方案更适合当前任务。

问题是.+贪婪地匹配换行符以外的一个或多个字符,也就是说,首先一次性获取所有字符串,然后正则表达式引擎开始回溯(沿着输入字符串向后移动,寻找匹配中的/)。因此,您可以从http获得匹配,直到最后一个/

要限制从http到第一个/的匹配,请使用否定字符类[^/]+而不是.+

^https?:'/'/[^'/]+'/
            ^^^^^^

查看regex演示

请注意,您不需要将s放入捕获组中使其成为可选的,未捕获的?是一个使前一个字符匹配一次或零次的量词。此外,{1}是一个冗余量词,因为这是默认行为,c将只匹配1个c(?:something)将只匹配一个something

var re = /^https?:'/'/[^'/]+'//; 
var str = 'http://foo.com/bar/test/foo.jpeg';
var result = str.replace(re, '');
document.getElementById("r").innerHTML = result;
<div id="r"/>

注意,您需要将替换结果分配给某个变量,因为在JS中,字符串是不可变的。

Regex解释

  • ^-字符串的开头
  • https?-httphttps子字符串
  • :'/'/——://的一个文字序列
  • [^'/]+-除/之外的1个或多个字符
  • '/-文字/符号

使用捕获基于组的正则表达式。

> var s = "http://foo.com/bar/test/foo.jpeg"
> s.match(/^https?:'/'/[^'/]+((?:'/[^'/]*)*)/)[1]
'/bar/test/foo.jpeg'