转 mysql5.7实现regex_replace正则替换功能(亲测可用)
1.开启mysql自定义函数支持
a.查看mysql当前是否支持编写自定义:
show variables like '%fun%';
1
b.log_bin_trust_function_creators=OFF表示没有开启自定义函数。输入开启命令。
set global log_bin_trust_function_creators=1;
1
注:此处不开启,后面自定义函数写好。调用不起作用!
2.编写regexp_replace()自定义函数
a.编写代码如下:
#创建前删除已经创建的自定义函数
drop function if exists regexp_replace;
CREATE FUNCTION `regexp_replace`(ori_str LONGTEXT,pattern VARCHAR(1000),repl_str VARCHAR(1000)) RETURNS longtext CHARSET utf8mb4
DETERMINISTIC
BEGIN
DECLARE tmp_str LONGTEXT;
DECLARE target_str LONGTEXT;
DECLARE str0 LONGTEXT;
DECLARE i1 INT;
DECLARE i2 INT;
# 此处假设MySQL5.7的正则表达式匹配类型是非贪婪模式,目前没有在官方文档内确认。
# 本函数的基本逻辑是,先从原文本开头不断的裁剪,不能匹配上时,则证明找到了目标文本的开头;如法炮制,找到目标文本的结尾。以此确定目标文本的位置。
# 示例:若原文本是AABBCC,正则表达式为B+,大致流程如下
# i1=1, tmp_str="AABBCC", match
# i1=2, tmp_str="ABBCC", match
# i1=3, tmp_str="BBCC", match
# i1=4, tmp_str="BCC", match
# i1=5, tmp_str="CC", unmatch
# 定位开始位置为4
# i2=6, tmp_str="BCC", match
# i2=5, tmp_str="BC", match
# i2=4, tmp_str="B", match
# i2=4, tmp_str="", unmatch
# 定位结束位置为4
# 所以输出结果是replace("AABBCC", "B", "")
# Warning:此函数效率比较差,而且在重复replace的时候,会重复匹配相同的位置,有违正则表达式的匹配逻辑。
# Warning:此函数在pattern能匹配repl_str会进入死循环,优化后再考虑加入报错机制。
# Warning:函数返回的是长文本格式,在存入数据库之前考虑转换一下数据类型。
SET tmp_str = ori_str; # 强迫症行为
# 循环查找以替换所有的目标字符串
loop0: LOOP
IF NOT tmp_str REGEXP pattern THEN
LEAVE loop0;
END IF;
# 目前初始值多设了一位
SET i1 = 1;
SET i2 = CHAR_LENGTH(tmp_str);
# 循环从头裁剪字符串
loop1: LOOP
SET str0 = SUBSTR(tmp_str, i1, i2-i1+1);
IF NOT str0 REGEXP pattern THEN
SET i1 = i1-1; # 当不能匹配上时,还原至上次循环到的位置。
LEAVE loop1;
ELSE
SET i1 = i1+1;
END IF;
END LOOP;
# 循环从尾裁剪字符串
loop2: LOOP
SET str0 = SUBSTR(tmp_str, i1, i2-i1+1);
IF NOT str0 REGEXP pattern THEN
SET i2 = i2+1; # 当不能匹配上时,还原至上次循环到的位置。
LEAVE loop2;
ELSE
SET i2 = i2-1;
END IF;
END LOOP;
# 根据定位到的头和尾,截取目标文本
SET target_str = SUBSTR(tmp_str, i1, i2-i1+1);
# 替换原文本中的目标文本
SET tmp_str = REPLACE(tmp_str, target_str, repl_str);
END LOOP;
RETURN tmp_str;
ENDb.上述代码执行后,检查下是否创建成功。结果已经创建成功。...
浏览更多内容请先登录。
立即注册
更新于:2023-08-01 20:55:04
|-转 REGEXP_REPLACE 替换匹配的字符串
SELECT id,personal_phone,REPLACE (personal_phone,REGEXP_REPLACE (personal_phone,'[1][3456789][0-9]{9}','') ,'') as new_str from table WHERE `personal_phone` NOT REGEXP '^[1][3456789][0-9]{9}$'
update table set personal_phone = REPLACE (personal_phone,REGEXP_REPLACE (personal_phone,'[1][3456789][0-9]{9}','') ,'') WHERE `personal_phone` NOT REGEXP '^[1][3456789][0-9]{9}$' limit 10
写在最后,mysql5.7用的是上文mysql5.7实现regex_replace正则替换功能(亲测可用) - 查问我看 - 查问网 (chawen.org)自定义的 REGEXP_REPLACE ...
浏览更多内容请先登录。
立即注册
更新于:2023-08-01 21:18:43
相关内容
查问我看笔记功能的实现过程-全文搜索待开启,试试yiisoft/yii2-sphinx
yii2框架中使用sphinx使用搜索引擎 多条件选择搜索
运行php composer.phar require --prefer-dist yiisoft/yii2-sphinx
Mysql问题整理
Yii2数据库报错-SQLSTATE[HY093]: Invalid parameter number: no para...
Mysql server has gone away 报错原因分析及解决办法
mysql 警告 could not be resolved: Name or service not known
Mysql用特殊字符设置密码遇到的问题
Mysql的函数substring使用注意事项
MySQL 5.7内存使用分析
mysql 命令整理
【mysql】主键、普通索引、唯一索引和全文索引的比较
没有接收到要导入的数据。可能是文件名没有提交,也可能是文件大小超出 PHP 限...
Mysql 报错'SQLSTATE[HY000] [1045] Access denied for user 'root'@'...
php连接mysql报错The server requested authentication method unknown to ...
Mysql登录提示ERROR 2003 (HY000): Can't connect to MySQL server o...
Mysql报错SQLSTATE[HY000]: General error: 1366 Incorrect string ...
全网最详尽的Centos和Windows系统 Mysql8 root忘记密码解决办法
mysql数据库操作 报错 #1030 - Got error 176 "Read page with wrong ...
Linux系统彻底卸载MySQL数据库
Linux下mysql5.7忘记root密码的解决方法
ERROR 1130 (HY000): Host '127.0.0.1' is not allowed to connect to...
mysql创建数据类型为JSON时,显示的longtext数据类型
mysql 修改编码utf8mb4依旧无法保存表情 Incorrect string value: '\x解决办法
MySQL 中 不等于 会过滤掉 Null 的问题
RECOVER_YOUR_DATA勒索恢复
Mysql知识学习
MySQL 8.0 索引特性1-函数索引
MySQL字符串函数substring:字符串截取
Mysql的临时变量取值3例
mysql查找字符串出现位置
mysql 更改AUTO_INCREMENT 失败的解决办法
MYSQL 数据库导入导出命令
mysql如何判断不包含某个字符串
Mysql中不要用操作符和函数名等等来命名字段
ORM 实例教程
Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结
MySQL 中 datetime 和 timestamp 的区别与选择
Invalid default value for ‘updated_at‘
设置MySQL的group_concat_max_len长度为最大值
MySQL中concat()、concat_ws()、group_concat()函数使用技巧与心得
mysql的left join和inner join的效率对比,以及如何优化
mysql 索引优化十例
MySQL数据表中有自增长主键时如何插入数据
bill_20210927.sql">mysqldump按条件导出mysql数据库数据
mysqli的基本使用
推荐内容