【问题标题】:MySQL REGEXP_SUBSTR() escaping issue?MySQL REGEXP_SUBSTR() 转义问题?
【发布时间】:2019-10-10 21:33:54
【问题描述】:

请以下面的正则表达式为例:

https://regexr.com/4ek7r

如您所见,正则表达式效果很好,并且与产品描述中的尺寸(例如 3/16 英寸等)相匹配。

我正在尝试使用 REGEXP_SUBSTR() 在 MySQL 8.0.15 中实现这一点

根据documentation,我将转义字符加倍,但正则表达式不起作用。

请看下面的 SQL fiddle:

https://www.db-fiddle.com/f/e6Ez3XCdU5Ahs91z6TQA8P/0

如您所见,REGEXP_SUBSTR() 返回NULL

我假设这是一个逃生问题 - 但我不是 100% 确定。

如何确保 MySQL 返回每个产品(行)的第一个匹配项,类似于 regexr.com 示例?

干杯

编辑:28/05/2019 - 根本原因

Wiktor 在下面的回答解决了我的问题,而且他的正则表达式更简洁,值得点赞。也就是说,我不明白为什么我的原始版本在从 SQL Server 移植到 MySQL 后无法正常工作。今天早上我终于注意到了这个问题 - 它与正则表达式无关,这是字符串连接中的新手错误!具体来说,我使用的是UPPER(Description + ' ')(即使用+)——它在SQL Server 中运行良好,但很明显; MySQL强制数字!所以我基本上是在针对0 运行我的正则表达式!用CONCAT 替换+ 实际上用原始正则表达式修复了我的原始查询 - 只是想我会分享这个以防它帮助其他人!

【问题讨论】:

  • 您在 regexr 中启用了不区分大小写的模式。在您的模式开始处添加(?i)
  • 请分享您尝试与正则表达式匹配的确切示例输入。
  • 嗨 Wiktor,我已经在 SQL 小提琴中提供了准确的示例输入,我还在 MySQL 中使用了 UPPER() 来处理大小写(正则表达式为大写)
  • 您尝试与(?=[.\s()$]) 匹配什么?我对$ 感兴趣 - 字符串结尾或$ 符号?
  • 我不认为 MySQL REGEXP_SUBSTR 可以做到(?=...(前瞻)。

标签: mysql regex icu


【解决方案1】:

在支持 ICU 正则表达式的 MySQL v8.x 中,您可以使用

SELECT Description, REGEXP_SUBSTR(Description, '(?im)(?=\\b(?:[0-9/]+(?:\\.[0-9/]+)?\\s*(?:[X-]|$)|[0-9/\\s]+(?:\\.[0-9/]+)?(?:[CM]?M|["”TH])))[0-9/\\s.]+(?:[CM]?M|["”TH])?(?:\\s*[/X-]\\s*[0-9/\\s.]+(?:[CM]?M|["”TH])?)?(?=[.\\s()]|$)') AS Size FROM tbl_Example

要点:

  • 标志可用作内联选项,(?mi)m 将在 ^$ 匹配行首/行尾时启用多行模式,i 将启用不区分大小写模式
  • [$] 匹配 $ 字符,要匹配行尾位置,您需要将 $ 移出字符类,在这种情况下使用交替((?=[\.\s\(\)$]) -> (?=[.\s()]|$),是的,不要逃避不必逃避的东西)
  • 匹配小数部分,最好使用类似(?:\.[0-9/]+)?的模式(匹配可选序列.,然后是1位或多个数字或/s)
  • (C|M)? 最好写成[CM]?(字符类更高效)

【讨论】:

    猜你喜欢
    • 2018-10-13
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-01
    • 2013-11-15
    相关资源
    最近更新 更多