mysql - 如何使用正则表达式在 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
这个表达式仍然没有抓住正确的数据,但我觉得它可能会让我更接近。
解决方案
我建议使用
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
输出:
推荐阅读
- java - 在 Java 中使用“for each”循环来反转 ArrayList
- azure-ad-b2c - AspNet Core 2.1 网站 Azure AD B2C 示例
- r - 根据 dplyr 中的正则表达式匹配从长变宽
- c# - 在 WCF 服务中使用 JSON 获取对象为空
- multithreading - Scala 中的哪个线程问题不允许 S3 文件有效加载?
- pandas - 如何获取我的 pandas 层次索引之一和一个热编码?
- python - 如何读取文件夹中的所有图像并将其转换为 Python 3 中的数字?
- javascript - 如何在 JavaScript 中获取 ag-grid 的变化?
- ios - Swift 解码具有多种不同格式的数据类型
- assembly - LLVM 访问变量