JavaScript REGEX:有没有一种方法可以在URL中使用斜杠字符后的斜杠来匹配,而不会出现负向后退?

时间:2018-11-02 20:07:41

标签: javascript regex

我正在尝试将斜杠与网址中的斜杠匹配,该斜杠不属于协议或查询字符串的一部分。

是否还有其他使用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);

2 个答案:

答案 0 :(得分:3)

您可以使用

.replace(/^(\S*?\/\/)|(\?.*)$|(\/)+/g, '$1$2$3')

请参见this regex demo

详细信息

  • ^(\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 );