1

我需要一个正则表达式来从如下表达式中提取表名和别名:

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. 有或没有别名

无论如何,我只关心表名和别名。

万一有所不同,查询将针对 SQL Server 数据库,我将在 C# 应用程序中使用它。

我熟悉遍历 Regex Match Collection 的 Matches 以及 RegEx 组。我只是在使用正确的 RegEx 表达式而苦苦挣扎。

4

2 回答 2

2

你可以使用:

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

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

于 2012-06-11T11:09:28.663 回答
2

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

它不是。

你需要重新考虑你的策略,因此你的问题,完全。

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

于 2012-06-11T11:11:41.787 回答