我需要一个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
请注意,有以下方法可以指定表格:
无论如何,我关心的只是表名和别名。
如果它有所不同,Query将针对SQL Server数据库,我将在C#应用程序中使用它。
我熟悉迭代正则表达式匹配集的匹配以及RegEx组。我正在努力只使用正确的RegEx表达式。
答案 0 :(得分:2)
您假设正则表达式足以解析像SQL这样的无上下文语言。
不是。
您需要完全重新考虑您的策略,从而重新考虑您的问题。
我会在一个公认的解析器生成器中查找SQL 解析器,例如YACC / Bison,ANTLR,JavaCC,......
答案 1 :(得分:1)
您可以使用:
(?i)\bJOIN\s+([\w.]+)(?:\s+(?!ON\b)(\w+))?
但请注意,这可能会产生无效结果,例如,如果您引用了匹配内容的字符串。在这种情况下,最好使用正确的SQL解析器而不是正则表达式。