1 不跟你多廢話 上代碼! /// <summary> /// SQL關鍵字轉換器 /// </summary> public class SqlConverter : IKeywordsConvertible { public SqlConverter(string[] keywords) { K ...
1 不跟你多廢話 上代碼!
/// <summary> /// SQL關鍵字轉換器 /// </summary> public class SqlConverter : IKeywordsConvertible { public SqlConverter(string[] keywords) { Keywords = keywords; } public SqlConverter() { } /// <summary> /// 關鍵字集合 /// </summary> public string[] Keywords { get { return keywords; } set { this.keywords = new string[value.Length]; for (int i = 0; i < value.Length; i++) { this.keywords[i] = value[i].ToLower(); } } } private string[] keywords; /// <summary> /// 字元緩衝區 /// </summary> private StringBuilder charBuilder = new StringBuilder(); /// <summary> /// 符號緩衝區 /// </summary> private StringBuilder symboBuilder = new StringBuilder(); /// <summary> /// 結果緩衝區 /// </summary> private StringBuilder resBuilder = new StringBuilder(); /// <summary> /// 上一個字元是否是字母 /// </summary> private bool lastIsLetter; /// <summary> /// 臨時變數 /// </summary> private string temp; /// <summary> /// 轉換 /// </summary> /// <param name="source">要轉換的字元串</param> /// <returns>轉換結果</returns> public string Convert(string source) { charBuilder.Clear(); symboBuilder.Clear(); resBuilder.Clear(); lastIsLetter = true; temp = string.Empty; // 打散源字元串 char[] charArray = source.ToArray<char>(); // 遍歷 foreach (var c in charArray) { if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { // 如果上一個符號不是字母,就把符號緩衝區推送 if (!lastIsLetter) { PushSymbols(); } charBuilder.Append(c); lastIsLetter = true; } else { // 如果上一個符號是字母,就把字母緩衝區推送 if (lastIsLetter) { PushLetters(); } symboBuilder.Append(c); lastIsLetter = false; } } // 處理最後一個緩衝區 if (lastIsLetter) { PushLetters(); } else { PushSymbols(); } return resBuilder.ToString(); } /// <summary> /// 將字元緩衝區推送至目標緩衝區 /// </summary> private void PushLetters() { temp = charBuilder.ToString(); if (Keywords.Contains(temp.ToLower())) { resBuilder.Append(temp.ToUpper()); } else { resBuilder.Append(temp); } charBuilder.Clear(); } /// <summary> /// 將符號緩衝區推送至目標緩衝區 /// </summary> private void PushSymbols() { resBuilder.Append(symboBuilder.ToString()); symboBuilder.Clear(); } }View Code
2 原理
第一步 :將一個SQL語句字元串拆開來,拆成 字元串-符號串-字元串-符號串-符號串-字元串 這樣
第二步 :然後判斷字元串是不是關鍵字,是的話就轉成大寫
第三部 :再將這些串拼起來
3 實現
原理看似很簡單,但實現卻不簡單。
要處理兩個問題
1 不可能全轉換之後再處理拼接,所以必須邊拼接邊轉換
2 狀態切換,什麼時候推送
實現步驟
1 源串打碎成char數組
2 拼接 重點是判斷 如何確定 字母和符號狀態,以及在狀態切換至將緩衝區推送。詳情看代碼
3 最後要再做一次,因為遍歷之後最後一個串沒有機會被推送
4 使用效果
5 後記
最近公司修改了SQL規範,要求SQL關鍵字大寫,誒,我寫了那麼多沒上線,都要改。作為一個程式員,這肯定是可以用代碼來乾的啊。
於是,我動手百度!對我沒有自己寫,我懶。
百到了一個工具,為了安全起見,我反編譯了工具,看了看代碼。沒危險。但是啊,看不懂,功能倒是實現了。
於是我就先用著把我的SQL都改了。
但是我覺得,我看不懂啊,沒學到。我想自己去實現!
於是隨後的幾天我開始思索如何來將SQL關鍵字變大寫,又不會影響其他的部分,包括回車換行這些不可見符號(就是不能用不可見符號做分割,因為如果有相連的不可符號,切割之後會丟失)。
在公司的年會上
我終於想到了,看著我身旁的妹子們(我同事),誒亞,好激動。
利用閑暇時間,寫了這個,獨立的思考沒有參考我找的的工具的代碼。
核心演算法發出來,一起學習與交流。