复杂正则表达式C#或perl
我在一个文件中有以下SQL文本。目标是从文件中识别数据库表名称。下面是一个通用的示例,我正在寻找一个通用的解决方案,可以是C#或Perl。我不太喜欢正则表达式,因此如果有人给我一个开始,我将不胜感激复杂正则表达式C#或perl,c#,regex,perl,pattern-matching,regex-lookarounds,C#,Regex,Perl,Pattern Matching,Regex Lookarounds,我在一个文件中有以下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.xy
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等),然后是文本“.”和表名 这是在示例中查找表名的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;
}
}
var matches=Regex.matches(您的字符串,@“(从内部\s+连接到左侧\s+外部\s+连接)\s+[a-zA-Z0-9]+\s*.\s*(?[a-zA-Z0-9]+)(\s+[a-zA-Z0-9]+)(\s*,\s*[a-zA-Z0-9]+\s*.\s*(?[a-zA-Z0-9]+)(\s+[a-zA-Z0-9]+];
foreach(匹配中的匹配)
{
foreach(在match.Groups[“table”]中捕获捕获。捕获)
{
字符串tableName=capture.Value;
}
}
在Perl中,同样的正则表达式至少会让您找到正确的方向,因为正则表达式基本上是交叉兼容的
编辑:更新为(笨拙?)查找多个以逗号分隔的表格,并合并Alan的建议,使用
“表格”
查找组并标记明确的选项。如果您遇到更多的问题,您可能希望按照中的建议,找到SQL解析器,而不是尝试使用正则表达式。谢谢Tim,我可能会遇到另一种模式,例如,我可能会遇到这样的模式“from db1.test5,db1.test6”。在本例中,我只想捕获test5和test6。然而,我看到我可以在test5上捕获(基于上述代码)。有什么方法可以同时匹配test5和test6+1,但是您应该使用组[“table”]
,而不是组[2]
。要了解原因,请将其添加到正则表达式的末尾:(?:\s+(\w+))
。您应该发现组[2]
现在包含表别名(a
、b
或d
),并且组[“表”]
与组[3]
相同。在同一个正则表达式中使用命名组和编号组从来都不是一个好主意。事实上,如果使用命名组,则应将ExplicitCapture标志设置为禁用编号组。