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 = ; 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();
}
}

2 原理

  第一步 :将一个SQL语句字符串拆开来,拆成 字符串-符号串-字符串-符号串-符号串-字符串 这样

  第二步 :然后判断字符串是不是关键字,是的话就转成大写

  第三部 :再将这些串拼起来

3 实现

  原理看似很简单,但实现却不简单。

  要处理两个问题

    1 不可能全转换之后再处理拼接,所以必须边拼接边转换

    2 状态切换,什么时候推送

  实现步骤

    1 源串打碎成char数组

    2 拼接 重点是判断 如何确定 字母和符号状态,以及在状态切换至将缓冲区推送。详情看代码

    3 最后要再做一次,因为遍历之后最后一个串没有机会被推送

4 使用效果

  

5 后记

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

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

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

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

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

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

  在公司的年会上

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

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

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

SQL关键字转换大写核心算法实现的更多相关文章

  1. sql关键字的解释执行顺序

      sql关键字的解释执行顺序 分类: 笔试面试总结2013-03-17 14:49 1622人阅读 评论(1) 收藏 举报 SQL关键字顺序 表里面的字段名什么符号都不加,值的话一律加上单引号 有一 ...

  2. SQL行列转换6种方法

    在进行报表开发时,很多时候会遇到行列转换操作,很对开发人员针对于SQL级别行列转换操作一直不甚理解,今天正好抽空对其进行了一些简单的总结.这里主要列举3种可以实现SQL行列转换的方法,包括通用SQL解 ...

  3. 完善SQL农历转换函数

    -------------------------------------------------------------------- --  Author : 原著:          改编:ht ...

  4. SQL 语句转换格式函数Cast、Convert 区别

    SQL 语句转换格式函数Cast.Convert CAST和CONVERT都经常被使用.特别提取出来作为一篇文章,方便查找. CAST.CONVERT都可以执行数据类型转换.在大部分情况下,两者执行同 ...

  5. SQL零星技术点:SQL中转换money类型数值转换为字符串问题

    --SQL中转换money类型数值转换为字符串问题,直接转换就转为两位了,所以需要做一下处理.具体请看下述sql实例. 1 create table #test(price money) insert ...

  6. hibernate sql查询转换成VO返回list

    hibernate sql查询转换成VO @Override public List<FenxiVo> getTuanDuiFenxiList(FenxiVo FenxiVo,Intege ...

  7. Elasticsearch 关键字与SQL关键字对比总结

    由于Elasticsearch和MongoDB/Redis/Memcache一样,是非关系型数据库.而平常使用的MySql,Oracle,SQLServer 等为关系型数据库,二者有着本质的区别,Es ...

  8. 用Java实现MVPtree——MVPtree核心算法代码的搭建

    项目需要,需要把MVPtree这种冷门的数据结构写入Java,然网上没有成形的Java实现,虽说C++看惯了不过对C++实现复杂结构也是看得蒙蔽,幸好客户给了个github上job什么的人用Java写 ...

  9. Mysql索引,有哪几种索引,什么时候该(不该)建索引;SQL怎么进行优化以及SQL关键字的执行顺序

    索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构. 1.按照索引列值的唯一性,索引可分为唯一索引和非唯一索引 非唯一索引:B树索引 crea ...

随机推荐

  1. Unity3d之shaderLab内置变量

    float4 _WorldSpaceCameraPos camera在世界坐标系中的位置float4 _WorldSpaceLightPos0 灯光在世界坐标系中的位置 转载请注明出处: http:/ ...

  2. 我的云服务之WWW

    云服务器系统是:[root@ip-172-31-27-132 system]# cat /etc/redhat-release Red Hat Enterprise Linux Server rele ...

  3. ibatis resultMap 的用法

    先看个具体的例子: <resultMap id=”get-product-result” class=”com.ibatis.example.Product”> <result pr ...

  4. 常见的Js

    //根据单独的值切换所有复选框 $("input[type='checkbox']").prop("checked", function( i, val ) { ...

  5. 3DTouch简单了解

    3D Touch的三大模块 代码Demo:https://github.com/haozheMa/3DTouch 在我们的app中使用3D Touch功能,主要分为以下三个模块: 1.Home Scr ...

  6. (简单) POJ 3468 A Simple Problem with Integers , 线段树+区间更新。

    Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...

  7. linux下配置ip地址四种方法(图文)

    (1)Ifconfig命令   第一种使用ifconfig命令配置网卡的ip地址.此命令通常用来零时的测试用,计算机启动后 ip地址的配置将自动失效.具体用法如下.Ipconfig  ethx   i ...

  8. 502 Bad Gateway(Nginx) 查看nginx日志有如下内容

    2016/09/01 09:49:41 [error] 79464#79464: *3 user "nagios" was not found in "/usr/loca ...

  9. [转]六款常用的linux C/C++ IDE

    之前在windows下开发习惯啦,linux改用vim开发代码,但是前期还是不熟悉看代码效率感觉有点低.由于看代码需要各种跳转查找我个人觉得还是IDE方便些,以前在windows下就挺喜欢使用code ...

  10. 获取url参数和时间格式化

    1. 获取url参数: var url = request("url"); //获取url参数 function request(paras) { //decodeURI() 函数 ...