SQL关键字转换大写核心算法实现

小编 2026-07-12 阅读:203 评论:0
1 不跟你多废话 上代码! /// <summary> /// SQL关...

1 不跟你多废话 上代码!

SQL关键字转换大写核心算法实现SQL关键字转换大写核心算法实现
    /// <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 使用效果

  SQL关键字转换大写核心算法实现

5 后记

  最近公司修改了SQL规范,要求SQL关键字大写,诶,我写了那么多没上线,都要改。作为一个程序员,这肯定是可以用代码来干的啊。

  于是,我动手百度!对我没有自己写,我懒。

  百到了一个工具,为了安全起见,我反编译了工具,看了看代码。没危险。但是啊,看不懂,功能倒是实现了。

  于是我就先用着把我的SQL都改了。

  但是我觉得,我看不懂啊,没学到。我想自己去实现!

  于是随后的几天我开始思索如何来将SQL关键字变大写,又不会影响其他的部分,包括回车换行这些不可见符号(就是不能用不可见符号做分割,因为如果有相连的不可符号,切割之后会丢失)。

  在公司的年会上

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

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

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

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
标签列表