【问题标题】:JavaScript REGEX: Is there a way to match slash after slash char in URL without negative lookbehind?JavaScript REGEX:有没有一种方法可以在 URL 中的斜线字符之后匹配斜线,而不会向后看?
【发布时间】:2019-04-07 02:08:38
【问题描述】:

我正在尝试匹配不属于协议或查询字符串一部分的 url 中后跟斜杠的斜杠。

是否有任何其他方法可以使用 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);

【问题讨论】:

  • 令人惊讶的是Firefox is behind the curve here
  • 你想在这里匹配什么?据我所知,您的示例中没有双冒号。
  • 不清楚在您的示例中应该匹配什么...
  • 试试.replace(/^(\S*?\/\/)|(\/)+/gm, "$1$2"),见demo。通常使用https?: 代替\S*?,如果您可以定义协议模式可能会更安全。
  • 那么应该是.replace(/^(\S*?\/\/)|(\?.*)$|(\/)+/g, '$1$2$3'),见this demo

标签: javascript regex


【解决方案1】:

你可以使用

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

this regex demo

详情

  • ^(\S*?\/\/) - 第 1 组(后来用替换模式中的 $1 引用):0 个或多个非空白字符,从字符串的开头到第一个 // 尽可能少
  • | - 或
  • (\?.*)$ - 第 2 组 ($2):? 字符和字符串的其余部分
  • | - 或
  • (\/)+ - 第 3 组 ($3) 捕获单个 / 字符,1 次或多次(每个捕获的 / 将覆盖组内存缓冲区中的前一个,因为它是“repeated capturing group”)

【讨论】:

    【解决方案2】:

    lookbehind 不足的正常解决方法是使用回调函数
    在替换部分。
    原因是您必须匹配错误部分才能移动匹配位置
    过去了。这需要回调函数中的逻辑。

    在 %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 );

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 2020-03-06
      • 2020-10-13
      • 1970-01-01
      • 2012-10-18
      相关资源
      最近更新 更多