复杂的正则表达式C#或perl

本文关键字:perl 正则表达式 复杂 | 更新日期: 2023-09-27 17:58:56

我在一个文件中有以下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中所有表的名称。在这种情况下,测试1、测试2、测试3和测试4

我知道这种模式是,表名前面有"from"、"internal join"、"left outer join",然后是数据库名(如db1、db2等),然后是文字"以及表名。

复杂的正则表达式C#或perl

这是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;
    }
}

同样的regex至少会让您在Perl中指向正确的方向,因为regex大多是交叉兼容的。

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