首页 > 解决方案 > 如何使用正则表达式在 MySql 中查找变量模式?

问题描述

我正在尝试从一长串格式化为 URL 地址的字符串中提取产品代码。该模式始终是 3 个字母后跟 3 个或 4 个数字(例如 ???### 或 ???####)。我曾尝试使用 REGEXP 和 LIKE 语法,但我的结果对两者都不适用/我不确定要使用哪些运算符。

第一个 select 语句接近于修剪 URL 以仅显示代码,但通常会显示它可能在 URL 字符串中找到的随机数字字符串。

第二个 select 语句比较简陋,但我不确定要使用哪些运算符。

哪个是最快的解决方案?

SELECT columnName, SUBSTR(columnName, LOCATE(columnName REGEXP "[^=\-][a-zA-Z]{3}[\d]{3,4}", columnName), LENGTH(columnName) - LOCATE(columnName REGEXP "[^=\-][a-zA-Z]{3}[\d]{3,4}", REVERSE(columnName))) AS extractedData FROM tableName

SELECT columnName FROM tableName WHERE columnName LIKE '%___###%' OR columnName LIKE '%___####%' 
-- Will take a substring of this result as well

示例数据:

randomwebsite.com/3982356923abcd1ab?random_code=12480712_ABC_DEF_ANOTHER_CODE-xyz123&hello_world=us&etc_etc

在这种情况下,所需的字符串是“xyz123”,并且所述模式的位置基于每个条目是可变的。

编辑

SELECT column, LOCATE(column REGEXP "([a-zA-Z]{3}[0-9]{3,4}$)", column), SUBSTR(column, LOCATE(column REGEXP "([a-zA-Z]{3}[0-9]{3,4}$)", column), LENGTH(column) - LOCATE(column REGEXP "^.*[a-zA-Z]{3}[0-9]{3,4}", REVERSE(column))) AS extractData From mainTable

这个表达式仍然没有抓住正确的数据,但我觉得它可能会让我更接近。

标签: mysqlregexsubstringregexp-substrregexp-like

解决方案


我建议使用

REGEXP_SUBSTR(column, '(?<=[&?]random_code=[^&#]{0,256}-)[a-zA-Z]{3}[0-9]{3,4}(?![^&#])')

详情

  • (?<=[&?]random_code=[^&#]{0,256}-)- 紧靠左边,必须有&or &, random_code=, 然后是 0 到 256 个字符,除了&and#后面跟一个-char
  • [a-zA-Z]{3}- 三个 ASCII 字母
  • [0-9]{3,4}- 三到四个 ASCII 数字
  • (?![^&#])- 后跟&,#或字符串结尾。

查看在线演示

WITH cte AS ( SELECT 'randomwebsite.com/3982356923abcd1ab?random_code=12480712_ABC_DEF_ANOTHER_CODE-xyz123&hello_world=us&etc_etc' val
              UNION ALL
              SELECT 'randomwebsite.com/3982356923abcd1ab?random_code=12480712_ABC_DEF_ANOTHER_CODE-xyz4567&hello_world=us&etc_etc'
              UNION ALL
              SELECT 'randomwebsite.com/3982356923abcd1ab?random_code=12480712_ABC_DEF_ANOTHER_CODE-xyz89&hello_world=us&etc_etc'
              UNION ALL
              SELECT 'randomwebsite.com/3982356923abcd1ab?random_code=12480712_ABC_DEF_ANOTHER_CODE-xyz00000&hello_world=us&etc_etc'
              UNION ALL
              SELECT 'randomwebsite.com/3982356923abcd1ab?random_code=12480712_ABC_DEF_ANOTHER_CODE-aaaaa11111&hello_world=us&etc_etc')
SELECT REGEXP_SUBSTR(val,'(?<=[&?]random_code=[^&#]{0,256}-)[a-zA-Z]{3}[0-9]{3,4}(?![^&#])') output
FROM cte

输出:

在此处输入图像描述


推荐阅读