我有一些关键字
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
也就是说,Case将被忽略,关键字将被大写。
为此,我写了一个函数
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
例如, select * From OrderTable 将输出 SELECT * FROM ORDERTable 。
我该如何解决这个问题?
我的其他问题是,有没有简单的方法来实现它?是否存在用于此类目的的任何现有算法?
答案 0 :(得分:1)
这是一种方式。
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);
}
//在此定义其他方法和类