您好,登錄后才能下訂單哦!
利用go語言怎么刪除sql語句中的注釋與字符串?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
關(guān)鍵函數(shù)如下:
` /** 將字節(jié)數(shù)組里面注釋和字符串,用空格替換 rangeBeg和rangeEnd是數(shù)組元素起始位置 左閉右開 */ func TrimSqlByteArray(sql []byte, rangeBeg int, rangeEnd int) []byte { sqlLength := rangeEnd - rangeBeg - 1; //刪除注釋或者字符串后 用空格填充 必免因刪除導(dǎo)致粘連改變sql語義 const chPad = ' ' //結(jié)果切片,預(yù)分配空間為入?yún)ql長度一半 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是一種變長字節(jié)編碼方式。對于某一個字符的UTF-8編碼,如果只有一個字節(jié)則其最高二進制位為0; //如果是多字節(jié),其第一個字節(jié)從最高位開始,連續(xù)的二進制位值為1的個數(shù)決定了其編碼的位數(shù),其余各字節(jié)均以10開頭。 //UTF-8最多可用到6個字節(jié)。 這里不考慮異常,因為go的字符串基本都是標(biāo)準(zhǔn)utf8編碼 i += getPreNotZeroCount(sql[i]) - 1 continue; } */
//本字符類型 預(yù)設(shè)為普通字符 charType = NORMAL ch := sql[i] //下一個字符 var chNext byte; chNext = getCharSafe(sql, rangeEnd, i + 1) //非有效sql內(nèi)容結(jié)束位置 endPos := 0 if ch == '-' && chNext == '-' { //單行注釋 charType = LINE //下標(biāo)移到非有效字符的最后 endPos = seekToNext(sql, i + 2, rangeEnd, charType) } else if ch == '/' && chNext == '*' { //多行注釋 charType = MULTI //下標(biāo)移到非有效字符的最后 endPos = seekToNext(sql, i + 2, rangeEnd, charType) } else if ch == '\'' { //字符串 charType = STRING //下標(biāo)移到非有效字符的最后 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是數(shù)組邊界 */ func seekToNext(sql []byte, begPos int, rangeEnd int, charType int) int { result := begPos; switch charType { case MULTI: for ; result < rangeEnd; result++ { ch := sql[result] chNext := getCharSafe(sql, rangeEnd, result+ 1)
if ch == '*' && chNext == '/' { result = result + 1; break; } } break
case LINE: for ; result < rangeEnd; result++ { ch := sql[result]
if ch == '\n' { break; } } break
case STRING: for ; result < rangeEnd; result++ { ch := sql[result] chNext := getCharSafe(sql, rangeEnd, result + 1)
//sql字符串里面連續(xù)的單引號被認(rèn)為是' 則不是字符串結(jié)束標(biāo)志 if ch == '\'' && chNext == '\'' { result = result + 1; continue; } else if ch == '\'' { break; } } break
default: break; } result++; return result; }
看完上述內(nèi)容,你們掌握利用go語言怎么刪除sql語句中的注釋與字符串的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。