如何从字符串中提取单词

时间:2016-10-05 21:29:45

标签: .net regex

我们从API中获取了一些日志服务,这些服务在查询正在访问的数据库时遇到了一些问题。

说,查询是这样的:

Select Top 10 * From DataBase..Table

我想要实现的目标是获得数据库"或者" ..."之前的文字。在字符串上。

此外,有时查询会如下:

Select Top 10 * From DataBase.Schema.Table

是否可以获得"数据库"这两个案件的字符串?

这是我一直在尝试做的事情,但我在正则表达方面表现不佳。

([A-Z]+\.+?([A-Z])*(\.)+[A-Z])

但这匹配以下(方括号):

Select Top 10 * From [DataBase..T]able

感谢您的帮助!

编辑: 这是在C#中完成的,在将查询/请求发送到数据库之前,我们正在尝试记录此API方法处理的每个请求。

1 个答案:

答案 0 :(得分:0)

正如在评论中提到的那样,由于您可能遇到的复杂性,以这种方式解析SQL是个坏主意。但如果这是你想要做的事情,那么下面的工作应该可行。它适用于select或delete语句,insert / update不起作用,因为它们具有不同的结构。

public string GetDbName(string sql)
{
    var sqlLower = sql.ToLower();
    var parts = sqlLower.Split(new string[] { "from " }, StringSplitOptions.RemoveEmptyEntries);

    if (parts.Length < 2)
    {
        //something is wrong in sql;
        //may be its not a select statement
        return null;
    }

    var tableName = parts[1]
        .Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
        .FirstOrDefault();

    var posOfTableName = tableName.LastIndexOf('.');
    var dbName = tableName.Substring(0, posOfTableName);

    //We can return here, but it will return lower case db name parts
    //We can also get the original value as well by looking into original parameter
    var indexOfStart = sqlLower.IndexOf(dbName);
    return sql.Substring(indexOfStart, dbName.Length);

}