MariaDB REGEXP_REPLACE替换参数中UPPER/UCASE不生效问题咨询
问题原因
这不是REGEXP_REPLACE()函数的bug,是写法没搞对SQL执行顺序和正则反向引用的生效时机:
REGEXP_REPLACE的所有入参都会在正则匹配启动前完成求值。你写的CONCAT('\\1', '-', UPPER('\\1'))执行时,\\1还只是普通字符串(内容为反斜杠加数字1),根本没绑定正则捕获到的实际内容,UPPER('\\1')计算完结果仍然是\1,完全没起到转大写的作用。- 最后实际传给替换逻辑的字符串是
\1-\1,两个反向引用都取到开头匹配的小写a,就输出了a-an der Mauer。至于原字符串里的Der变成der,是你当前使用的排序规则为大小写不敏感模式,正则匹配时做了大小写归一处理,不属于核心问题。
正确写法
不要在替换串的构造参数里对反向引用占位符套字符串函数,直接用PCRE正则原生支持的替换大小写转换标记即可,替换串里的\U标记会将后续捕获的内容自动转为大写:
SELECT REGEXP_REPLACE('an Der Mauer', '^([[:lower:]])', '\\1-\\U\\1');
执行后就能得到你预期的a-An der Mauer效果。
如果后续要对捕获内容做更复杂的函数运算,建议拆分步骤:先把要处理的文本片段截取出来单独加工,再拼回原字符串,不要在REGEXP_REPLACE的替换参数里提前操作反向引用占位符。
内容的提问来源于stack exchange,提问作者hellerim
相关产品推荐
相关产品推荐

