Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 大写C中字符串中的关键字(SQL关键字美化)?_C#_.net_Algorithm_Data Structures - Fatal编程技术网

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“”太幼稚,无法正确实现。关键字也可以作为列名或别名出现,您不希望替换这些列名或别名。