【发布时间】:2017-06-10 17:51:40
【问题描述】:
我有一些关键字
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;
}
这里发生的事情是,如果子字符串与关键字匹配,则该方法将子字符串大写,如 Replace 方法我使用 IndexOf
例如select * From OrderTable会输出SELECT * FROM ORDERTable。
我该如何解决这个问题?
我的其他问题是,有没有简单的方法来实现它?是否有用于此类目的的现有算法?
【问题讨论】:
-
这将非常棘手,因为您必须弄清楚单词边界,这并不总是意味着空格(想想句号、感叹号、问号等。
-
@rory 正则表达式可以很好地检测单词边界。
-
“有什么简单的方法来实现它吗?” - 什么,解析 SQL 并漂亮地打印它?是的,其他人早在您之前就已经这样做了,您确实不想重新发明那个轮子。祝你好运处理
insert into [Group] ([From], [As], [On]) values ('select', 'table', 'in -- order'),它将被传递到区分大小写的数据库引擎。在你还可以的时候放弃这艘船。 做好或根本不做。 -
@CodeCaster :是的,我只是想为我的学习实现一个 SQL 查询美化器。您能否提及一些现有的算法来进行这种类型的解析。
标签: c# .net algorithm data-structures