请看下面的正则表达式示例:
如您所见,正则表达式运行良好,与产品说明中的尺寸(例如 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
实际上用原始正则表达式修复了我的原始查询 - 只是想我会分享它以防它帮助其他人!
最佳答案
在支持 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]?
(字符类更有效)
关于MySQL REGEXP_SUBSTR() 转义问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56289966/