2012-06-11 159 views
0

我需要一個正則表達式從喜歡錶達提取表名和別名捕獲表名和別名:正則表達式從SQL語句

INNER JOIN dbo.table1 t ON t.x = table n.y 
INNER JOIN table2 on table2.x = table n.y 
INNER JOIN table3 t3 on t3.x = tablen.y 

從上面的查詢,我會想捕捉:

(Table Name, Alias) 
table1, t 
table2, " " <-- No alias specified so blank or null 
table3, t3 

注意,有指定表以下幾種方式:

  1. 有或沒​​有所有者,例如dbo.table1
  2. 使用或不使用別名

在任何情況下,我所關心的是表名和別名。

如果它有所作爲,Query將針對SQL Server數據庫,我將在C#應用程序中使用它。

我熟悉遍歷正則表達式匹配集合以及RegEx組。我只能用正確的RegEx表達式來使用。

回答

1

你可以使用:

(?i)\bJOIN\s+([\w.]+)(?:\s+(?!ON\b)(\w+))? 

但要注意的是,如果您所引述的字符串相匹配的內容,這可能給無效的結果,例如。在這種情況下,最好使用適當的SQL解析器而不是正則表達式。

+0

我會稍後再試。謝謝。 –

+0

嗨,我有一個快速嘗試這個正則表達式,似乎符合我的需求!我將在今晚將其整合到我的代碼中,然後肯定會知道。再次:非常感謝。 –

+0

@ user1448758,不要忘記你認爲值得的[接受/投票答案](http://meta.stackexchange.com/a/5235/163680)。 ;-) – Qtax

2

您假設一個正則表達式足夠強大,足以解析像SQL這樣的上下文無關語言。

它不是。

你需要完全重新考慮你的策略,因此你的問題。

我會尋找一個SQL 解析器,在一個公認的解析器生成器,例如, YACC/Bison,ANTLR,JavaCC,...

+0

http://stackoverflow.com/questions/589096/parsing-sql-code-in-c-sharp –

+0

* [這是](http://stackoverflow.com/questions/7434272/比賽的-BN-CN-EG-使用正則表達式,PCRE aaabbbccc - )*。但使用適當的解析器通常更好。 – Qtax

+0

@QTax它*不是*,根據定義。否則解析器和RE不會是不同的東西。您的引用不支持可以使用RE解析SQL的斷言。 – EJP