热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用go实现删除sql里面的注释和字符串功能(demo)_Golang

这篇文章主要介绍了使用go实现删除sql里面的注释和字符串功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,

项目里面有一个需求,要对sql进行简单的语法分析

为了避免sql里面的字符串和注释对语法分析做干扰,我写了一个java函数,对sql进行修剪,删除里面字符串和注释,用空格代替
周末闲着没事,我用go重新实现了这个功能,感觉应该会有后来人可以用上

说明:
sql里面的注释有两种单行注释和多行注释,其中单行注释以--开头,以\n结尾,多行注释以/开头,以/结尾
sql字符串是以'开头,'结尾,但特别的地方是连续两个单引号是代表一个单引号而不是字符串结束标志

关键函数如下:

`
/**

将字节数组里面注释和字符串,用空格替换 rangeBeg和rangeEnd是数组元素起始位置 左闭右开
*/
func TrimSqlByteArray(sql []byte, rangeBeg int, rangeEnd int) []byte {
sqlLength := rangeEnd - rangeBeg - 1;
//删除注释或者字符串后 用空格填充 必免因删除导致粘连改变sql语义
const chPad = ' '

//结果切片,预分配空间为入参sql长度一半
result := make([] byte, 0, sqlLength / 2)

//本字符类型
var charType int = NORMAL;
for i := rangeBeg; i 
 //本字符类型 预设为普通字符
 charType = NORMAL
 ch := sql[i]

 //下一个字符
 var chNext byte;
 chNext = getCharSafe(sql, rangeEnd, i + 1)

 //非有效sql内容结束位置
 endPos := 0

 if ch == '-' && chNext == '-' {
 	//单行注释
 	charType = LINE
 	//下标移到非有效字符的最后
 	endPos = seekToNext(sql, i + 2, rangeEnd, charType)
 } else if ch == '/' && chNext == '*' {
 	//多行注释
 	charType = MULTI
 	//下标移到非有效字符的最后
 	endPos = seekToNext(sql, i + 2, rangeEnd, charType)
 } else if ch == '\'' {
 	//字符串
 	charType = STRING
 	//下标移到非有效字符的最后
 	endPos = seekToNext(sql, i + 1, rangeEnd, charType)
 }

 //如果字符是非有效字符 则用空格代替 否则保持原样
 if charType == NORMAL {
 	result = append(result, ch)
 } else {
 	result = append(result, chPad)
 	i = endPos - 1
 }
}

return result;
}

/**

获取字符串或者注释的右边界位置(不包含)

rangeEnd是数组边界
*/
func seekToNext(sql []byte, begPos int, rangeEnd int, charType int) int {

result := begPos;

switch charType {
case MULTI:
for ; result 
if ch == '*' && chNext == '/' {
 		result = result + 1;
 		break;
 	}
 }

 break
case LINE:
for ; result 
if ch == '\n' {
 		break;
 	}
 }

 break
case STRING:
for ; result 
//sql字符串里面连续的单引号被认为是' 则不是字符串结束标志
 	if ch == '\'' && chNext == '\'' {
 		result = result + 1;
 		continue;
 	} else if ch == '\'' {
 		break;
 	}
 }

 break
default:
break;
}

result++;

return result;
}

完整代码及单元测试已上传 https://github.com/kingstarer/kingstarer.git


推荐阅读
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
author-avatar
gigi-dd
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有