【问题标题】:Uppercase the keywords in a string in C# (SQL Beautification with keywords)? [duplicate]C#中字符串中的关键字大写(带关键字的SQL美化)? [复制]
【发布时间】: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


【解决方案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);

}

//这里定义其他方法和类

【讨论】:

  • select[foo],[bar]from[table] 是有效的 SQL。空格分隔符 (Query.Split(' ')) 对于正确的实现来说太天真了。关键字也可以作为列名或别名出现,您不想想要替换它们。
猜你喜欢
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多