mysql - MySQL REGEXP_SUBSTR() 转义问题?
问题描述
请采用以下示例正则表达式:
如您所见,正则表达式效果很好,并且与产品描述中的尺寸(例如 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
实际上修复了我的原始查询 - 只是想我会分享这个以防它帮助其他人!
解决方案
在支持 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]?
(字符类更有效)
推荐阅读
- selenium - Selenium + Chrome Webdrivers 杀死内存
- python - 无法从一些类似盒子的容器中获取标题
- android-gradle-plugin - 用户无法使用 gradlew 登录。与其他用户相同的权限
- jenkins - 如何通过 Jenkins 替换文件中的令牌?
- html - 如何内联此进度条以用于 gmail?
- android - Android Studio 中 Ubuntu 18.04 上的 kotlin-compiler-embeddable.jar 错误
- html - 火狐鬼影飞入
- java - JVM 是否在运行时在 java 中创建原始类型的对象?
- aggregation-framework - Mongodb聚合查询到java代码
- swift - 显示来自 Firebase 的用户信息