在C#中用字符串大写关键字(SQL Beautification with keywords)?

时间:2017-01-25 13:56:43

标签: 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"
};

我想在字符串

中用大写这些关键字
  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

我该如何解决这个问题?

我的其他问题是,有没有简单的方法来实现它?是否存在用于此类目的的任何现有算法?

1 个答案:

答案 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);

}

//在此定义其他方法和类