MySQL REGEXP_SUBSTR() 转义问题?

标签 mysql regex icu

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

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 实际上用原始正则表达式修复了我的原始查询 - 只是想我会分享它以防它帮助其他人!

最佳答案

在支持 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/

相关文章:

c++ - 在 ICU UnicodeString 中,countChar32() 和 length() 有什么区别?

Elasticsearch 使用 ICU 分析插件中的 icu_tokenizer

php - 使用AJAX和PHP将数据发送到mysql

PHP - 太多 mysql_query ("SELECT .. ") ..?

python - 快速多行正则表达式查找/替换\r和\n

Ruby: bool 正则表达式方法的正确语法是什么?

php - 如何将换行符/换行符内爆到空格?

c++ - 如何解析小数点分隔符为冒号 : 的数字的字符串表示形式

php - 项目返工 : Should I use primary composite keys and json for translations with Laravel?

php - 更新数据sql查询语法错误