【问题标题】:Regex which captures url prefix but excludes www捕获 url 前缀但不包括 www 的正则表达式
【发布时间】:2018-12-14 21:43:11
【问题描述】:

我一直在努力思考 javascript 中的正则表达式使用(不是专家),但我无法解决这个问题。

这是我的网址的模式:

https://www.prefix.site.com

还有我目前的正则表达式:

/(?:(\w+)\.)?site\.com

我需要做的是捕获“.site”之前的前缀,但我不想包含“https://www.”,因为两者都是“www.”。我的前缀可能存在也可能不存在。我的前缀的一个例子可能是一个环境,例如https://testing.site.com

上面的正则表达式的问题是如果有一个“www”。没有我的前缀,那么它将捕获“www”。作为前缀,这不是我需要的。

我有点用消极的后视解决了它,但由于它在 javascript 中不可用,我无法使用它。

任何提示将不胜感激!

【问题讨论】:

  • 这里有一个很好的资源:@​​987654323@
  • /.*(?:(\w+)\.)?site\.com/U 这应该可以工作
  • 抱歉,U 修饰符在 Javascript 中不可用。虽然这应该可以工作 /.*?(?:(\w+)\.)?site\.com/ 不过这个正则表达式有很多需要改进的地方

标签: javascript regex lookaround


【解决方案1】:

在捕获组的最开始,您可以对www. 负前瞻,以确保捕获组仅在包含www. 以外的内容时才匹配:

((?!www\.)\b\w+\.)?site\.com

https://regex101.com/r/K8btgd/1

注意单词边界\b - 这是为了确保捕获组要么在非单词字符之后开始(如/.),要么根本不匹配(以防止匹配如ww.site.com,其中第三个w在它之前)

【讨论】:

  • 这看起来整洁干净,尽管它似乎正在捕获前缀后面的点 (.)。我不知道 \b 语法!
  • 嗯,对了,对于点,只需将其移出一个可选的非捕获组,类似于您最初所做的 regex101.com/r/K8btgd/2
  • @dellwarrior 当某个答案解决了您的问题时,请考虑将其标记为已接受以表明问题已解决 :)
【解决方案2】:

听起来以下内容对您有用:

https?://(?:w{3}\.)?(\w+)\.site\.com

【讨论】:

    【解决方案3】:

    根据您的需要,此表达式将仅捕获前缀:(?!w{1,3}\.)[\w-]+(?=\.example)

    https://regex101.com/r/X4L9ZZ/2

    它支持破折号以及在您的前缀/子域中正确允许“w”。

    示例:

    const getPrefix = uri => {
      const matched = uri.match(/(?!w{1,3}\.)[\w-]+(?=\.example)/);
      return matched && matched[0];
    }
    
    getPrefix("https://www.prefix.example.com"); // "prefix"
    getPrefix("https://prefix.example.com"); // "prefix"
    getPrefix("https://www.example.com"); // null
    getPrefix("https://example.com"); // null
    

    好消息是“lookbehinds”很快将在 JS 中得到全面支持。它已经处于第 4 阶段,只需要跨浏览器实现! https://github.com/tc39/proposal-regexp-lookbehind

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-04
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 2015-01-20
      • 2013-10-31
      相关资源
      最近更新 更多