MySQL REGEXP_SUBSTR() 转义问题?

MySQL REGEXP_SUBSTR() escaping issue?

请看下面的正则表达式示例:

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() returns NULL

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

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

干杯

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

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

在支持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 将在 ^$ 匹配一行的 start/end 时启用多行模式i 将启用不区分大小写模式
  • [$] 匹配一个 $ 字符,要匹配行尾位置,需要将 $ 移出字符 class,在此使用交替case ((?=[\.\s\(\)$]) -> (?=[.\s()]|$), 对,不用转义的也不转义)
  • 匹配小数部分,最好使用类似(?:\.[0-9/]+)?的模式(它匹配可选的.序列,然后是1个或多个数字或/s)
  • (C|M)?最好写成[CM]?(一个字符class更有效率)