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

Posted thx9537

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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关键字变大写,又不会影响其他的部分,包括回车换行这些不可见符号(就是不能用不可见符号做分割,因为如果有相连的不可符号,切割之后会丢失)。

  在公司的年会上

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

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

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

以上是关于SQL关键字转换大写核心算法实现的主要内容,如果未能解决你的问题,请参考以下文章

关于数字金额转换大写金额,sql语句

JAVA实现字符串大小写转换问题

oracle中sql问的大写与小写会影响sql语句的效率吗?

如何用SQL语言实现人民币的大小写转换

2016计算机大会后记——机器学习:发展与未来

从核心数据中获取名称并将其转换为大写