首页 > 数据库 >mysql 5.7 增加regexp_replace函数

mysql 5.7 增加regexp_replace函数

时间:2023-01-05 11:25:31浏览次数:50  
标签:tmp SET 5.7 i1 i2 replace str mysql match

CREATE DEFINER=`root`@`%` 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

标签:tmp,SET,5.7,i1,i2,replace,str,mysql,match
From: https://www.cnblogs.com/rainbow--/p/17026987.html

相关文章

  • MySQL单列索引与多列索引的区别
    本文讨论当查询条件在两个以上时,单列索引与联合索引对查询性能的影响Mysql版本5.7,数据库引擎innodb测试中使用explain+具体sql可看索引使用情况一些影响索引性能......
  • mysql删除重复数据
    一个bug导致的一张日志表出现大量重复数据,需要删除重复数据,神仙sql如下,sql过于复杂把navicate的sql美化器都给整不会了,美化不出来,执行结果这条sql删除了75万条数据:DELETE......
  • 【MySQL 8】MySQL 5.7都即将停只维护了,是时候学习一波MySQL 8了【转】
    MySQL8新特性选择MySQL8的背景:MySQL5.6已经停止版本更新了,对于MySQL5.7版本,其将于2023年10月31日停止支持。后续官方将不再进行后续的代码维护。另外,MySQL8.0......
  • Windows忘记Mysql8密码重置
    先关掉系统服务。在mysql8系统,用mysqld--console--skip-grant-tables--shared-memory可以无密码启动服务。服务启动后,打开另一个cmd。以空密码登入系统。mysql-ur......
  • centos7 安装 MySQL
    首先登陆MySQL官网。点击downloads。https://dev.mysql.com/downloads/这里我选择的是社区版。之后出现了很多选项。根据需求选择。因为我是centos,一开始准备使用y......
  • MySQL索引
    面试题整理-MySQL索引MySQL#1.什么是索引-官方定义:一种帮助mysql提高查询效率的数据结构-索引的优点:1、大大加快数据查询速度-索引的缺点:1......
  • MySQL安装
    一、官网下载mysql安装包https://www.mysql.com/安装其它版本windows安装包macbook安装二、安装mysqlwindows案例三、配置环境变量,启动mysql服务#......
  • MySQL语法
    一、数据库引擎#显示系统默认存储引擎showvariableslike'%engine%';二、数据库操作#如果数据库存在先删除dropdatabaseifexistsmyschool;#创建数据库create......
  • Mysql的事务原理
    一、持久性依靠的是redolog,重做日志,记录的是事务提交时数据也的物理修改,是用来实现事务的持久性。该日志文件由两部分组成,重做日志缓冲,(redologbuffer)和重做日志......
  • MYSQL中MVCC是什么?
    基本概念MVCC:全称Multi-VersionConcurrencyControl,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,快照读为MySQL实现MVCC提供了--个非阻塞读功......