【问题标题】:Extract hostname from an URL in MySQL with REGEX使用正则表达式从 MySQL 中的 URL 中提取主机名
【发布时间】:2021-01-16 16:33:17
【问题描述】:

我正在尝试使用 MySQL 函数 REGEXP_SUBSTR 从 URL 中提取主机名。

我得到的最接近的正则表达式如下:

(?:\w+\.)?(\w+\.\w+)

这相对来说可行,但问题是捕获的主机名是分组

假设我们试图匹配https://www.w3schools.com/home,上面的正则表达式会返回:

  1. 完全匹配 www.w3schools.com
  2. 第 1 组。 w3schools.com

REGEXP_SUBSTR 似乎只减去 “完全匹配” 中的内容,因此上述解决方案结果不正确。 如何修改上述模式以将主机名包含在完整匹配中,而不是组中?

【问题讨论】:

  • 提示:主机名中可以包含-
  • 这个模式(?:\w+\.)?(\w+\.\w+) 是一个非常广泛的 url 匹配。它匹配中间有一个点的单词字符。
  • 您应该准确说明您拥有的 MySQL 版本。是第 8 版吗?
  • @AndyLester 不,这个问题是面向 REGEXP 的。

标签: mysql regex


【解决方案1】:

假设 MySQL 是 8 版,使用

REGEXP_SUBSTR(column, '\\w+\\.\\w+(?=/|$)')

proof

说明

--------------------------------------------------------------------------------
  \w+                      word characters (a-z, A-Z, 0-9, _) (1 or
                           more times (matching the most amount
                           possible))
--------------------------------------------------------------------------------
  \.                       '.'
--------------------------------------------------------------------------------
  \w+                      word characters (a-z, A-Z, 0-9, _) (1 or
                           more times (matching the most amount
                           possible))
--------------------------------------------------------------------------------
  (?=                      look ahead to see if there is:
--------------------------------------------------------------------------------
    /                        '/'
--------------------------------------------------------------------------------
   |                        OR
--------------------------------------------------------------------------------
    $                        before an optional \n, and the end of
                             the string
--------------------------------------------------------------------------------
  )                        end of look-ahead

【讨论】:

  • 它在 w3schools.com/home?refer=www.referredby.com 这样的 URL 上失败,因为它匹配两者。但总体而言,解决方案似乎很棒。有什么办法可以防止上述情况发生?
  • @Constantin 答案中的代码不能同时匹配。 REGEXP_SUBSTR(column, '\\w+\\.\\w+(?=/|$)') 默认返回第一个匹配项。另外,请查看regex101.com/r/W2eajd/1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-23
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
相关资源
最近更新 更多