mysql5.7实现regex_replace正则替换功能(亲测可用)

PHPer 2023-08-01 512 0 0

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;
END

b.上述代码执行后,检查下是否创建成功。结果已经创建成功。...

立即注册

更新于: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 的问题

    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的效率对比,以及如何优化

    mysqli的基本使用

    推荐内容

    分享几个好用的bt搜索bt资源下载网址网站

    影视电影剧集动漫综艺bt资源在线播放网址网站推荐分享

    全网最新bt磁力搜索引擎bt资源bt网站网址分享

    人气美女女优百度指数排行榜(波多野结衣,苍井空,三上悠亚,深田咏美,桥本有菜,北条...

    最强人造人深田咏美,业界的社交女王

    人生起起落落的三上悠亚,成名前的清纯风,怎么搭配出来的?

    业内第一大长腿,桥本有菜的腿究竟有多长

    波多野结衣,岛国业界著作最多的超级劳模

    日本AV界NO.1,苍井空是多少宅男的疯狂?

    美女女优视频混剪 This Girl-Laza Morgan

    怎样使用V2Ray代理和SSTap玩如魔兽世界/绝地求生/LOL台服/战地3/黑色沙漠/彩...

    sstap游戏代理教程 从此玩如魔兽世界/绝地求生/LOL台服/战地3/黑色沙漠/彩虹六...

    影视电影剧集动漫综艺bt资源在线播放网址网站推荐分享