我正在尝试将斜杠与网址中的斜杠匹配,该斜杠不属于协议或查询字符串的一部分。
是否还有其他使用REGEX的方法来实现此目的,但并不落后,因为并非所有浏览器都支持它?
我的例子:
const urls = `
https://asdf.com//asdf//asdf
http://asdf.com//asdf//asdf
ftp://asdf.com//asdf//asdf
//asdf.com//asdf//asdf
//asdf.com//asdf//asdf?test=//
z39.50s://asdf//
`.replace(/(?<!(^[\w\d-.]{2,}\:|^|\?.*))\/(?=\/)/gim, '');
console.log(urls);
答案 0 :(得分:3)
您可以使用
.replace(/^(\S*?\/\/)|(\?.*)$|(\/)+/g, '$1$2$3')
详细信息
^(\S*?\/\/)
-第1组(在替换模式中后来称为$1
):从字符串开头到字符串之间至少0个或多个非空格字符首先//
|
-或(\?.*)$
-第2组($2
):一个?
字符和其余字符串|
-或(\/)+
-组3($3
)捕获单个/
字符,一次或多次(每次捕获的/
将覆盖组内存缓冲区中的前一个字符)因为它是一个“ repeated capturing group”)答案 1 :(得分:1)
后向不足的正常解决方法是使用回调函数
在替换部分。
原因是您必须匹配错误的部分才能移动匹配位置
过去了。这需要回调函数中的逻辑。
在%99.99的情况下,如果您有其他替换产品,则必须以这种方式进行。
对于您而言,这没有关系,因为您有一个空白的替代品。
通过合并组替换来掩盖,其中剥离由
控制
没有分组。
如果要用空字符串以外的任何内容替换它,
这是唯一的方法。
为此,这是您(大部分)未更改的正则表达式,用于回调。
( # (1 start)
(?: ^ [\w\d\-.]{2,} : | ^ | \? .* )
//
) # (1 end)
| /
(?= / )
var urls = [
'https://asdf.com//asdf//asdf',
'http://asdf.com//asdf//asdf',
'ftp://asdf.com//asdf//asdf',
'//asdf.com//asdf//asdf',
'//asdf.com//asdf//asdf?test=//',
'z39.50s://asdf//' ];
for (var i = 0; i < urls.length; i++)
{
urls[i] = urls[i].replace(
/((?:^[\w\d\-.]{2,}:|^|\?.*)\/\/)|\/(?=\/)/gm,
function(match, Grp1)
{
if ( Grp1 )
return Grp1;
return '';
}
);
}
console.log( urls );