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

发表于:2017-2-04 09:40

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:rocketRobin    来源:51Testing软件测试网采编

  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();
}
}
  2、原理
  第一步 :将一个SQL语句字符串拆开来,拆成 字符串-符号串-字符串-符号串-符号串-字符串 这样
  第二步 :然后判断字符串是不是关键字,是的话就转成大写
  第三部 :再将这些串拼起来
  3、实现
  原理看似很简单,但实现却不简单。
  要处理两个问题
  1、不可能全转换之后再处理拼接,所以必须边拼接边转换
  2、状态切换,什么时候推送
  实现步骤
  1、源串打碎成char数组
  2、拼接 重点是判断 如何确定 字母和符号状态,以及在状态切换至将缓冲区推送。详情看代码
  3、最后要再做一次,因为遍历之后最后一个串没有机会被推送
  4、使用效果
  5、后记
  最近公司修改了SQL规范,要求SQL关键字大写,诶,我写了那么多没上线,都要改。作为一个程序员,这肯定是可以用代码来干的啊。
  于是,我动手百度!对我没有自己写,我懒。
  百到了一个工具,为了安全起见,我反编译了工具,看了看代码。没危险。但是啊,看不懂,功能倒是实现了。
  于是我就先用着把我的SQL都改了。
  但是我觉得,我看不懂啊,没学到。我想自己去实现!
  于是随后的几天我开始思索如何来将SQL关键字变大写,又不会影响其他的部分,包括回车换行这些不可见符号(就是不能用不可见符号做分割,因为如果有相连的不可符号,切割之后会丢失)。
  在公司的年会上
  我终于想到了,看着我身旁的妹子们(我同事),诶亚,好激动。
  利用闲暇时间,写了这个,独立的思考没有参考我找的的工具的代码。
  核心算法发出来,一起学习与交流。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号