Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复杂正则表达式C#或perl_C#_Regex_Perl_Pattern Matching_Regex Lookarounds - Fatal编程技术网

复杂正则表达式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

我在一个文件中有以下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等),然后是文本“.”和表名

这是在示例中查找表名的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标志设置为禁用编号组。