C# 大写C中字符串中的关键字(SQL关键字美化)?
我有一些关键词C# 大写C中字符串中的关键字(SQL关键字美化)?,c#,.net,algorithm,data-structures,C#,.net,Algorithm,Data Structures,我有一些关键词 private static readonly string[] Keywords = { "SELECT", "FROM", "WHERE", "GROUP", "HAVING", "ORDER", "LEFT", "RIGHT", JOIN", "INNER", "OUTER", "ASC", "DESC", "AND", "OR","IN", "BETWEEN", "BY", "NOT", "ON", "AS", "CASE", "WHEN", "ELSE" }; 我
private static readonly string[] Keywords =
{
"SELECT", "FROM", "WHERE", "GROUP", "HAVING", "ORDER", "LEFT", "RIGHT", JOIN", "INNER", "OUTER", "ASC", "DESC", "AND", "OR","IN", "BETWEEN", "BY", "NOT", "ON", "AS", "CASE", "WHEN", "ELSE"
};
我想把这些关键字大写成字符串
string Query = "Select * fRom TableA"
此字符串应转换为SELECT*FROM TableA
也就是说,大小写将被忽略,关键字将大写
为此,我编写了一个函数
public static string GetUppercaseKeyword(string sqlStr)
{
string sqlText = string.Empty;
int foundAt = 0;
foreach (var keyword in Keywords)
{
if (sqlStr.IndexOf(keyword, foundAt, StringComparison.CurrentCultureIgnoreCase) == -1)
{
continue;
}
sqlStr = Replace(sqlStr, keyword, keyword.ToUpper(), StringComparison.OrdinalIgnoreCase);
}
return sqlStr;
}
替换功能是
public static string Replace(string str, string old, string @new, StringComparison comparison)
{
@new = @new ?? "";
if (string.IsNullOrEmpty(str) || string.IsNullOrEmpty(old))
return str;
int foundAt = 0;
while ((foundAt = str.IndexOf(old, foundAt, StringComparison.CurrentCultureIgnoreCase)) != -1)
{
str = str.Remove(foundAt, old.Length).Insert(foundAt, @new);
foundAt += @new.Length;
}
return str;
}
这里发生的事情是,如果一个子字符串与关键字匹配,那么方法大写的子字符串,就像我使用IndexOf的Replace方法一样
例如,select*From OrderTable将输出select*From OrderTable
我怎样才能解决这个问题
我的其他问题是,有没有简单的方法来实现它?是否存在用于此类目的的现有算法 这里有一个方法
void Main()
{
Console.WriteLine(Replace());
}
private static readonly string[] Keywords =
{
"SELECT", "FROM", "WHERE",
"GROUP", "HAVING", "ORDER",
"LEFT", "RIGHT", "JOIN", "INNER",
"OUTER", "ASC", "DESC", "AND", "OR","IN",
"BETWEEN", "BY", "NOT", "ON", "AS", "CASE", "WHEN", "ELSE"
};
static string Query = "Select * fRom TableA";
static bool Exists(string word) =>
Keywords.Any(x => x.Equals(word, StringComparison.OrdinalIgnoreCase));
static string Replace()
{
var parts = Query.Split(' ');
var upperedParts = parts.Select(x => (Exists(x)) ? x.ToUpper() : x);
return String.Join(" ", upperedParts);
}
//在此处定义其他方法和类这将非常棘手,因为您必须找出单词边界,这并不总是意味着空白—想想句号、感叹号、问号等。@rory正则表达式可以很好地检测单词边界。有没有简单的方法来实现它什么,解析SQL并打印它?是的,其他人早在你之前就已经这么做了,你不想重新发明那个轮子。祝您好运,正在处理将要传递到区分大小写的数据库引擎的[Group][From]、[As]、[On]值“select”、“table”、“in-order”中的insert。趁你还可以的时候放弃这艘船。做得好或根本不做。@CodeCaster:是的,我只是想为我的学习实现一个SQL查询美化器。请您介绍一些现有的算法来进行这种类型的解析。从[table]中选择[foo],[bar]是有效的SQL。空间分隔符查询.Split“”太幼稚,无法正确实现。关键字也可以作为列名或别名出现,您不希望替换这些列名或别名。