項目中一個小需求,3個正則表達式匹配SQL表名,需要通過C#代碼提取出數(shù)據(jù)訪問層執(zhí)行的SQL里面涉及的表名当凡,用于記錄一些日志相關(guān)的內(nèi)容山害,因為是比較老的項目,數(shù)據(jù)訪問層完全是ado.net的寫法沿量,并沒有使用像ef core這種高級的ORM來輔助進行持久化浪慌。
C# 3個正則表達式匹配SQL表名 4
正則表達式匹配SQL表名
如果想從數(shù)據(jù)訪問層(或者持久層做的事情)里面提取出SQL,對于ef core來說則是非常方便的朴则,本站之前就有類似的文章介紹权纤。EF Core獲取上下文SQL語句。
現(xiàn)在遇到的需求就是一個簡單的提取各類語句乌妒,如select汹想,update,delete撤蚊,insert古掏,簡單來說就是將增刪改查涉及到的SQL里面,將表名提取出來侦啸,如果用字符串截取等方式比較燈煩槽唾,這種臟活,累活就交給正則表達式來完成吧匹中。廢話不說了夏漱,直接上代碼拿去用。
核心代碼
? ? ? ? /// <summary>
? ? ? ? /// 從SQL語句里面解析出寫入顶捷,更新,刪除的表名
? ? ? ? /// </summary>
? ? ? ? /// <param name="sql"></param>
? ? ? ? /// <returns></returns>
? ? ? ? private static List<string> GetTables(string sql)
? ? ? ? {
? ? ? ? ? ? var insert = @"[\s\t]*INSERT [\s\t\r\n]*(INTO|)[\s\t\r\n]*[A-Za-z0-9_.""\[\]]*[\s\t\r\n]*";
? ? ? ? ? ? var update = @"[\s\t]*UPDATE [\s\t\r\n]*(SET|)[\s\t\r\n]*[A-Za-z0-9_.""\[\]]*[\s\t\r\n]*";
? ? ? ? ? ? var delete = @"[\s\t]*DELETE *(FROM|)[\s\t\r\n]*(WHERE|)[\s\t\r\n]*[A-Za-z0-9_.""\[\]]*[\s\t\r\n]*";
? ? ? ? ? ? List<string> list = new List<string>();
? ? ? ? ? ? var m = Regex.Matches(sql, insert, RegexOptions.IgnoreCase);
? ? ? ? ? ? foreach (Match item in m)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? list.Add(item.Value.Trim());
? ? ? ? ? ? }
? ? ? ? ? ? var m2 = Regex.Matches(sql, update, RegexOptions.IgnoreCase);
? ? ? ? ? ? foreach (Match item in m2)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? list.Add(item.Value.Trim());
? ? ? ? ? ? }
? ? ? ? ? ? var m3 = Regex.Matches(sql, delete, RegexOptions.IgnoreCase);
? ? ? ? ? ? foreach (Match item in m3)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? list.Add(item.Value.Trim());
? ? ? ? ? ? }
? ? ? ? ? ? return list.Select(x => { return x.Substring(x.LastIndexOf(' ')).Trim(); }).Distinct().ToList();
? ? ? ? }
完整代碼
class Program
? ? {
? ? ? ? static void Main(string[] args)
? ? ? ? {
? ? ? ? ? ? var sql = @"
UPDATE jhrs.com
? SET [Id] = <Id, uniqueidentifier,>
? ? ? ,[Name] = <Name, varchar(50),>
? ? ? ,[xSql] = <xSql, text,>
? ? ? ,[Num] = <Num, int,>
? ? ? ,[Tag] = <Tag, varchar(50),>
? ? ? ,[Gec] = <Gec, text,>
? ? ? ,[Key] = <Key, varchar(50),>
WHERE <搜索條件,,>
GO
INSERT znlive.net
? ? ? ? ? ([Id]
? ? ? ? ? ,[Key]
? ? ? ? ? ,[UserId]
? ? ? ? ? ,[Message]
? ? ? ? ? ,[ErrorUrl]
? ? VALUES
? ? ? ? ? ('')
GO
DELETE FROM [dbo].[Sys_Manage]
? ? ? WHERE <搜索條件,,>
GO
";
? ? ? ? ? ? var list = GetTables(sql);
? ? ? ? ? ? foreach (var item in list)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Console.WriteLine(item);
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? /// <summary>
? ? ? ? /// 從SQL語句里面解析出寫入,更新,刪除的表名
? ? ? ? /// </summary>
? ? ? ? /// <param name="sql"></param>
? ? ? ? /// <returns></returns>
? ? ? ? private static List<string> GetTables(string sql)
? ? ? ? {
? ? ? ? ? ? var insert = @"[\s\t]*INSERT [\s\t\r\n]*(INTO|)[\s\t\r\n]*[A-Za-z0-9_.""\[\]]*[\s\t\r\n]*";
? ? ? ? ? ? var update = @"[\s\t]*UPDATE [\s\t\r\n]*(SET|)[\s\t\r\n]*[A-Za-z0-9_.""\[\]]*[\s\t\r\n]*";
? ? ? ? ? ? var delete = @"[\s\t]*DELETE *(FROM|)[\s\t\r\n]*(WHERE|)[\s\t\r\n]*[A-Za-z0-9_.""\[\]]*[\s\t\r\n]*";
? ? ? ? ? ? List<string> list = new List<string>();
? ? ? ? ? ? var m = Regex.Matches(sql, insert, RegexOptions.IgnoreCase);
? ? ? ? ? ? foreach (Match item in m)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? list.Add(item.Value.Trim());
? ? ? ? ? ? }
? ? ? ? ? ? var m2 = Regex.Matches(sql, update, RegexOptions.IgnoreCase);
? ? ? ? ? ? foreach (Match item in m2)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? list.Add(item.Value.Trim());
? ? ? ? ? ? }
? ? ? ? ? ? var m3 = Regex.Matches(sql, delete, RegexOptions.IgnoreCase);
? ? ? ? ? ? foreach (Match item in m3)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? list.Add(item.Value.Trim());
? ? ? ? ? ? }
? ? ? ? ? ? return list.Select(x => { return x.Substring(x.LastIndexOf(' ')).Trim(); }).Distinct().ToList();
? ? ? ? }
? ? }
運行效果
經(jīng)過測試遭居,上面的代碼是可以達到要求怀骤,只是如果你有更簡單的寫法,歡迎留言反饋钓葫。
原文地址:正則表達式匹配SQL表名