java代表预设一个SQL_我的go练手项目--使用go实现“删除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 < rangeEnd; i++ {

/*

*utf8编码不影响判断

//跳过非英文字符

if sql[i] & 0x80 != 0 {

//utf8编码:UTF-8是一种变长字节编码方式。对于某一个字符的UTF-8编码,如果只有一个字节则其最高二进制位为0;

//如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的位数,其余各字节均以10开头。

//UTF-8最多可用到6个字节。 这里不考虑异常,因为go的字符串基本都是标准utf8编码

i += getPreNotZeroCount(sql[i]) - 1

continue;

}

*/

//本字符类型 预设为普通字符

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值