2013-02-12 89 views
0

我在文件中有以下SQL文本。目標是從文件中識別數據庫表名。下面只是一個通用的例子,我正在尋找一個通用的解決方案,無論是在C#或Perl。我沒有做很多的正則表達式的,因此,如果有人給我一開始複雜正則表達式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」,「內部連接」,「左外連接」,然後數據庫名稱(如db1, db2等),然後是文字'。'和表名。

回答

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中指出正確的方向,因爲正則表達式主要是跨平臺兼容性。

編輯:更新爲(笨拙?)查找多個以逗號分隔的表格,並納入Alan的建議,使用"table"來查找組並標記ExplicitCapture。如果遇到更多問題,您可能需要按照Regular expression to find all table names in a query中的建議進行操作,並找到SQL解析器,而不是試圖使用正則表達式。

+0

感謝Tim,我可能會遇到另一種模式,例如,我可以使用類似於「from db1.test5,db1.test6」 這樣的模式。在這種情況下,我想捕獲但test5和test6。但是我看到我可以捕獲test5(基於上面的代碼)。有什麼辦法可以同時匹配test5和test6 – bcd 2013-02-13 00:59:27

+0

+1,但是你應該使用'Groups [「table」]'而不是'Groups [2]'。爲了明白爲什麼,把它添加到你的正則表達式的末尾:'(?:\ s +(\ w +))?'。您應該發現'Group [2]'現在包含表別名('a','b'或'd'),'Groups [「table」]'與Groups [3]'相同。在同一個正則表達式中使用命名組和編號組絕不是一個好主意。實際上,如果您使用命名組,則應將ExplicitCapture標誌設置爲禁用編號組。 – 2013-02-13 01:08:32