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

  在公司的年会上

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

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

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

转载于:https://www.cnblogs.com/rocketRobin/p/6349311.html

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

  1. mysql sql归类_带有归类SQL强制转换SQL Server归类介绍

    mysql sql归类 SQL Server collation refers to a set of character and character encoding rules, and infl ...

  2. python模型预测_《Python机器学习——预测分析核心算法》——1.5 构建预测模型的流程...

    本节书摘来异步社区<Python机器学习--预测分析核心算法>一书中的第1章,第1.5节,作者:[美]Michael Bowles(鲍尔斯),更多章节内容可以访问云栖社区"异步社 ...

  3. Sql语句为什么大写

           SQL之所以要求用大写,其实和SQL的执行有关,SQL也算是一种程序语言,而且比我们平时用的程序语言更高级,大小写的问题只有一点,那就是:你写好的SQL语句,在执行的时候,是先转化为大写 ...

  4. 【《操作系统慕课版》合集】期末复习 + 核心算法整理 + 课后答案

    所有章节归类好了概念.算法,同时课后的简答题也一并给出了答案.祝各位复习愉快~ 整理不易希望能点个赞~ 目录 第一章 操作系统概述 第二章 进程的描述与控制 第三章 处理机调度与死锁 第四章 进程同步 ...

  5. 《Python机器学习——预测分析核心算法》——2.4 基于因素变量的实数值预测:鲍鱼的年龄...

    本节书摘来异步社区<Python机器学习--预测分析核心算法>一书中的第2章,第2.4节,作者:[美]Michael Bowles(鲍尔斯),更多章节内容可以访问云栖社区"异步社 ...

  6. 【张钹院士 | 大师谈AI】迈向第三代人工智能「AI核心算法」

    关注:决策智能与机器学习,深耕AI脱水干货 作者:张钹, 朱军, 苏航  报道:中国科学杂志社 如需转载,请联系作者 摘 要 人工智能 (artificial intelligence, AI) 自1 ...

  7. 对话系统 | (3) 阿里云小蜜对话机器人背后的核心算法

    原文地址 分享嘉宾:唐呈光 阿里巴巴 算法专家 编辑整理:刘汝洲 内容来源:阿里小蜜 & DataFun AI Talk 出品社区:DataFun 阿里小蜜智能对话开发平台是智能服务事业部推出 ...

  8. 浅谈德州扑克AI核心算法:CFR

    本文首发于行者AI 引言 自2017年AlphaGo打败世界围棋冠军柯洁后,人工智能彻底进入大众视野,一时间棋牌类的AI在人工智能界掀起了一股大风.其实早在AlphaGo之前,人们就对棋牌类的人工智能 ...

  9. 三维重建 | 关键技术及建模流程综述「AI核心算法」

    关注:耕智能,深耕AI脱水干货 作者:菜鸟知识搬运工@CSDN  编辑:深蓝学院 报道:3D视觉工坊 转载请联系作者 前言 三维重建技术通过深度数据获取.预处理.点云配准与融合.生成表面等过程,把真实 ...

最新文章

  1. java中多线程编程案例_Java中多线程编程实战的实现线程_Java编程_Java程序员_课课家...
  2. 国外学python的软件_全球开发者调查报告:IT人最想学习 Go 和 Python、美国开发者收入最高...
  3. Docker教程(三) Docker网络访问和数据管理
  4. 【配置文件】Log4j
  5. 电脑遇到问题需要重新启动_如何解决电脑风扇转一下就停开不了机的问题-系统城...
  6. 新房装修有哪些除味小妙招?
  7. 谷歌研究员发现新的 iOS 安全系统
  8. [LeetCode] Trapping Rain Water II 题解
  9. 高性能Mysql(第三版)笔记
  10. c语言高级代码编程图,c语言图形编程代码(C language programming code).doc
  11. PSB格式转换太麻烦?Aspose.PSD教你用代码将大型PSB文件转换为PDF/JPEG格式
  12. android串口调试源码,android串口调试助手源代码
  13. 图的表现形式第一篇(Java实现)
  14. FCC--Chunky Monkey(数组分组)和Slasher Flick(截断数组)
  15. Facebook路由事故未圆,何以元宇宙?
  16. python深度学习--Keras函数式API(多输入,多输出,类图模型)
  17. 基于Python+django的茶叶销售商城网站
  18. linux共享文件夹找不到
  19. Spring Framework源码使用 spring-aspects AOP遇到的问题
  20. swift-annotations:java编译时警告主版本 52 比 51 新, 此编译器支持最新的主 版本。

热门文章

  1. python如何并发上千个get_用greenlet实现Python中的并发
  2. 面试题:问题:Java中,char型变量中能不能存储一个中文汉字,为什么?
  3. 39 n 39 是不是c语言常量,自考“高级语言程序设计”习题答案详解(39)
  4. 335b装配程序流程图_某建设项目装配式框架结构PC构件吊装监理细则(方案)
  5. android运用 sqlite 实现简单的通讯录_大一新生作品:利用 C 语言实现quot;通讯录管理系统quot;,直言太简单...
  6. 如何能够得到灵敏度更高的150kHz导航信号检测板?
  7. RASPBERRY PI PICO 树莓派PICO开发板双核高性能低功耗RP2040芯片
  8. 电灯泡内通有交流电,为什么看不到灯泡在闪烁?
  9. 第一届全国大学生智能汽车竞赛获奖名单
  10. 【java8】中stream的.findAny().orElse (null) 是什么意思?