RegEx用于从SQL语句捕获表名和别名

时间:2012-06-11 11:05:31

标签: sql regex

我需要一个RegEx来从表达式中提取表名和别名:

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. 有或没有别名
  3. 无论如何,我关心的只是表名和别名。

    如果它有所不同,Query将针对SQL Server数据库,我将在C#应用程序中使用它。

    我熟悉迭代正则表达式匹配集的匹配以及RegEx组。我正在努力只使用正确的RegEx表达式。

2 个答案:

答案 0 :(得分:2)

您假设正则表达式足以解析像SQL这样的无上下文语言。

不是。

您需要完全重新考虑您的策略,从而重新考虑您的问题。

我会在一个公认的解析器生成器中查找SQL 解析器,例如YACC / Bison,ANTLR,JavaCC,......

答案 1 :(得分:1)

您可以使用:

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

但请注意,这可能会产生无效结果,例如,如果您引用了匹配内容的字符串。在这种情况下,最好使用正确的SQL解析器而不是正则表达式。