0

我在一个文件中有以下 SQL 文本。目标是从文件中识别数据库表名称。下面只是一个通用示例,我正在寻找通用解决方案,无论是 C# 还是 Perl。我没有做很多正则表达式,因此如果有人给我一个开始,我将不胜感激

select
a.xyz,
b.xyz,c.xyz,
d.xyz
from db1.test1 a
inner join db2.test2 b
on a.xyz = b.xyz
inner join
(
select a.xyz
from db1.test3) as c
on a.xyz=c.xyz
left outer join db1.test4 d
on c.xyz = d.xyz

所以基本上,我需要自动找出 SQL 中所有表的名称。在这种情况下,test1、test2、test3 和 test4

我知道模式是表名前面有“from”、“inner join”、“left outer join”,然后是数据库名称(例如 db1、db2 等),然后是文字 '。和表名。

4

1 回答 1

2

这是将在示例中找到您的表名的 C# 代码:

var matches = Regex.Matches(yourString, @"(from|inner\s+join|left\s+outer\s+join)\s+[a-zA-Z0-9]+\s*\.\s*(?<table>[a-zA-Z0-9]+)(\s+[a-zA-Z0-9]+)?(\s*,\s*[a-zA-Z0-9]+\s*\.\s*(?<table>[a-zA-Z0-9]+)(\s+[a-zA-Z0-9]+)?)*", RegexOptions.ExplicitCapture);
foreach (Match match in matches)
{
    foreach (Capture capture in match.Groups["table"].Captures)
    {
        string tableName = capture.Value;
    }
}

相同的正则表达式至少会让你在 Perl 中指向正确的方向,因为正则表达式大多是交叉兼容的。

编辑:更新为(笨拙地?)查找以逗号分隔的多个表,并结合艾伦的建议用于"table"查找组和标记ExplicitCapture。如果遇到更多问题,您可能希望按照正则表达式中的建议查找查询中的所有表名并找到 SQL 解析器,而不是尝试使用正则表达式。

于 2013-02-12T23:56:05.373 回答