MySQL REGEXP_REPLACE 翻译自 PCRE REGEXP
MySQL REGEXP_REPLACE translation from PCRE REGEXP
我正在尝试提取字符串字段的音量以按数字排序。
给定以下数据:
- 300 毫升左右
- 300毫升的东西
- 有些特别(300 毫升)
- 8-v 不应该匹配的东西
第一次尝试:
只需将字符串转换为 unsigned
(在此线程中找到:reference)
问题:显然还要考虑第4个数据示例
第二次尝试:使用REGEXP_REPLACE to extract the value (found in this thread: reference)
CAST(
REGEXP_REPLACE(
LOWER(column),
"[:digit:]+[:space:]*ml",
"///"
) as UNSIGNED
) AS volume
...使用 manual.
中定义的 character_class
es
问题: character_class
es 似乎没有按预期工作(可能是字符 class 空格名称的问题?)。
第三次尝试:使用通用的 Regexp 标记
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
。
问题在于将替换结果转换为无符号的组合。
使用后:
REGEXP_SUBSTR(
LOWER(article.name),
"[:digit:]+[:space:]*ml"
) AS volume
而不是 REGEXP_REPLACE
并删除无符号转换(不管双括号还是单括号)REGEXP 工作正常。
试试这个:
CAST(
REGEXP_SUBSTR(
LOWER(@c),
"([[:digit:]]+)[[:space:]]*ml" )
AS UNSIGNED) AS VOLUME;
你肯定想要 REGEX_SUBSTR() 而不是 REGEX_REPLACE() 来达到你的目的。
我已经在 MySQL 8 和 MariaDB 10.3 - 10.5 上试过了。无论如何,对我来说,双括号 [[:digit:]]
是必需的。如果您使用旧的 \s
表示法,则需要加倍 \
转义字符:\s+
(MariaDb's implementation of REGEX_SUBSTR() does not accept the optional parameters that MySQL's does.
我不得不说,在医疗保健 IT 部门工作过,将正则表达式与药物剂量结合起来让我感到害怕。当心!测试!测试!如果你有病人,他们会感谢你。
我正在尝试提取字符串字段的音量以按数字排序。
给定以下数据:
- 300 毫升左右
- 300毫升的东西
- 有些特别(300 毫升)
- 8-v 不应该匹配的东西
第一次尝试:
只需将字符串转换为 unsigned
(在此线程中找到:reference)
问题:显然还要考虑第4个数据示例
第二次尝试:使用REGEXP_REPLACE to extract the value (found in this thread: reference)
CAST(
REGEXP_REPLACE(
LOWER(column),
"[:digit:]+[:space:]*ml",
"///"
) as UNSIGNED
) AS volume
...使用 manual.
中定义的character_class
es
问题: character_class
es 似乎没有按预期工作(可能是字符 class 空格名称的问题?)。
第三次尝试:使用通用的 Regexp 标记
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
。
问题在于将替换结果转换为无符号的组合。
使用后:
REGEXP_SUBSTR(
LOWER(article.name),
"[:digit:]+[:space:]*ml"
) AS volume
而不是 REGEXP_REPLACE
并删除无符号转换(不管双括号还是单括号)REGEXP 工作正常。
试试这个:
CAST(
REGEXP_SUBSTR(
LOWER(@c),
"([[:digit:]]+)[[:space:]]*ml" )
AS UNSIGNED) AS VOLUME;
你肯定想要 REGEX_SUBSTR() 而不是 REGEX_REPLACE() 来达到你的目的。
我已经在 MySQL 8 和 MariaDB 10.3 - 10.5 上试过了。无论如何,对我来说,双括号 [[:digit:]]
是必需的。如果您使用旧的 \s
表示法,则需要加倍 \
转义字符:\s+
(MariaDb's implementation of REGEX_SUBSTR() does not accept the optional parameters that MySQL's does.
我不得不说,在医疗保健 IT 部门工作过,将正则表达式与药物剂量结合起来让我感到害怕。当心!测试!测试!如果你有病人,他们会感谢你。