zoukankan      html  css  js  c++  java
  • SQL关键字转换大写核心算法实现

    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关键字变大写,又不会影响其他的部分,包括回车换行这些不可见符号(就是不能用不可见符号做分割,因为如果有相连的不可符号,切割之后会丢失)。

      在公司的年会上

      我终于想到了,看着我身旁的妹子们(我同事),诶亚,好激动。

      利用闲暇时间,写了这个,独立的思考没有参考我找的的工具的代码。

      核心算法发出来,一起学习与交流。

    如果你觉得这篇博客有用,那就点击右下角的【推荐】支持一下我把:D
    你还可以【关注我】,我会经常更新博客的 ;D
  • 相关阅读:
    Django的模型层(1)- 单表操作(上)
    Django-1版本的路由层、Django的视图层和模板层
    Django准备知识-web应用、http协议、web框架、Django简介
    MySQL数据库(5)- pymysql的使用、索引
    MySQL数据库(4)- 多表查询、可视化工具Navicat的使用、设计模式MVC
    MySQL练习题
    MySQL数据库(3)- 完整性约束、外键的变种、单表查询
    MySQL数据库(2)- 库的操作、表的操作、数据的操作、存储引擎的介绍
    MySQL数据库(1)- 数据库概述、MySQL的安装与配置、初始SQL语句、MySQL创建用户和授权
    前端收尾
  • 原文地址:https://www.cnblogs.com/rocketRobin/p/6349311.html
Copyright © 2011-2022 走看看