【发布时间】:2012-01-12 14:56:42
【问题描述】:
我正在编写一个 c# 类库,它允许我扫描 SQL 服务器查询并将查询中的对象提取到正确的分组中,例如:
SELECT * FROM "My Server"."Northwind"."dbo"."Product Sales for 1997" Group By CategoryID
这个正则表达式将匹配上面的字符串并将“My Server”、“Northwind”、“dbo”和“Product Sales for 1997”分成四组,这就是我想要的。
(?i)\bFROM\b\s+[\["]([^\]"]*)[\]"].{1}[\["]([^\]"]*)[\]"].{1}[\["]([^\]"]*)[\]"].{1}[\["]([^\]"]*)[\]"].{1}
我正在寻找的是一个单一的正则表达式,它可以为以下任何组合捕获服务器名称、数据库名称、模式名称和对象名称(无论如何这不是一个详尽的列表):
SELECT * FROM dbo."Product Sales for 1997" // should return groups 2 & 3
SELECT * FROM Northwind."My Schema"."My view or table function" // should return groups 1, 2 & 3
SELECT * FROM "My view or table function" // should return group 3
SELECT * FROM dbo."My View 1" AS V1 JOIN "My View 1" AS V2 ON V1.ID = V2 // should return groups 2 & 3
换句话说,我想将各种组件分为以下几组:
组 0 --> 服务器名称
第 1 组 --> 数据库名称
第 2 组 --> 架构
第 3 组 --> 对象名称
我试图避免创建多个正则表达式来处理每个可能的组合,以避免我的类库变得太大和复杂,但作为一个正则表达式 n00b,它被证明有点困难。
【问题讨论】:
-
正则表达式不适合这个。你需要一个解析器。例如
Microsoft.Data.Schema.ScriptDom -
感谢您的快速响应,但是由于时间限制和编写解析器的复杂性,编写解析器是不可能的。我可以使用任何预先存在的 T-SQL 解析器吗?我确实设法编写了正则表达式来从 EXEC 语句中提取组件,但只有在对象名称中没有空格时才有效。我很快意识到,要涵盖所有组合,我最终会得到太多我真正想要的正则表达式。
-
Microsoft.Data.Schema.ScriptDom同上。如果这对您不可用,请参阅 OP in this question 的 cmets 以获得另一种选择。 -
我会看看那些。非常感谢!
-
解析器是个好主意,但是如果你需要一个快速的正则表达式修复,从示例中看起来像当你有 xxx.xxx.xxx.xxx 它是组 0,1,2,3 ; xxx.xxx.xxx 是 1,2,3; xxx.xx 是 2,3; xxx 是 3。然后你可以将
\bFROM\b\s+(?:(?:(?:xx)?xx)?xx)?xx作为你的正则表达式,xx是你上面的正则表达式,[\["]([^\]"]*)[\]"].{1}。 (还要注意.{1}是多余的;.可以)。