【发布时间】:2021-01-07 11:48:29
【问题描述】:
我正在尝试提取字符串的体积字段以按数字排序。
给定以下数据:
- 300 毫升的东西
- 300毫升的东西
- 一些特别的东西(300 毫升)
- 8-v 不应该匹配的东西
第一次尝试:
只需将字符串转换为unsigned(在此线程中找到:reference)
问题:显然也会考虑到第 4 个数据示例。
第二次尝试:使用REGEXP_REPLACE提取值(在此线程中找到:reference)
CAST(
REGEXP_REPLACE(
LOWER(column),
"[:digit:]+[:space:]*ml",
"///"
) as UNSIGNED
) AS volume
...使用manual 中定义的character_classes。
问题:character_classes 似乎没有按预期工作(可能是空格的字符类名称有问题?)。
第三次尝试:使用常见的正则表达式标记
CAST(
REGEXP_REPLACE(
LOWER(column),
"\d+\s*ml",
"///"
) as UNSIGNED
) AS volume
...这似乎效果更好。
问题:它也再次匹配了第4个数据示例。
问题:我如何在 MySQL REGEXP_REPLACE 中执行某种正向前瞻,它只会匹配数据示例 1-3(由于强制转换为较低而忽略大小写敏感)?
我尝试过的那个似乎在 PCRE(带有全局标志)中工作正常,但在 MySQL 中却不行:
^.*\d+\s*ml.*$(忽略丢失的捕获组)
翻译如下:匹配所有内容,直到 1 个或多个数字,后跟 0 个或多个空格,并找到字符串 ml。
【问题讨论】:
-
毫升和兆升?
-
8.0 使用
\d; 8.0 之前使用[:digit:]。等等。
标签: mysql regex regexp-replace mysql-8.0