首页 > 解决方案 > MySQL REGEXP_SUBSTR() 转义问题?

问题描述

请采用以下示例正则表达式:

https://regexr.com/4ek7r

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

我正在尝试在 MySQL 8.0.15 中使用REGEXP_SUBSTR()

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

请参阅以下 SQL 小提琴:

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强制数字!所以我基本上是在针对 a 运行我的正则表达式0+用原始正则表达式替换CONCAT实际上修复了我的原始查询 - 只是想我会分享这个以防它帮助其他人!

标签: mysqlregexicu

解决方案


在支持 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/]+)?like模式(它匹配一个可选序列,.然后是1个或多个数字或/s)
  • (C|M)?最好写成[CM]?(字符类更有效)

推荐阅读