[英]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.