繁体   English   中英

如何从字符串中提取单词

[英]How to extract a word from a string

我们有一个来自API的日志服务,在捕获查询正在访问的数据库时遇到了一些麻烦。

假设查询如下:

Select Top 10 * From DataBase..Table

我想要实现的是在字符串上获取“ DataBase”或“ ..”之前的文本。

另外,有时会出现如下查询:

Select Top 10 * From DataBase.Schema.Table

在两种情况下都可以获取“ DataBase”字符串吗?

这是我一直在尝试做的事情,但是我在正则表达式中的表现并不理想。

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

但这与以下内容匹配(在方括号中):

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

谢谢您的帮助!

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

正如注释中提到的那样,由于可能会遇到复杂性,因此以这种方式解析SQL是一个坏主意。 但是,如果这是您想做的事情,那么应该可以执行以下操作。 它适用于选择或删除语句,因为它们具有不同的结构,所以插入/更新将不起作用。

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

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM