从查询中获取表名

Ver*_*ion 2 java regex

我的问题对于你们中的许多人来说应该很简单假设我有以下 SQL 并且我想使用正则表达式获取表名:

SELECT name, age FROM table1
Run Code Online (Sandbox Code Playgroud)

使用这个表达式我可以得到那个好的

Pattern p = Pattern.compile(".*FROM\\s+(.*?)($|\\s+[WHERE,JOIN,START\\s+WITH,ORDER\\s+BY,GROUP\\s+BY])", Pattern.CASE_INSENSITIVE);
        Matcher result = p.matcher(pSql);
        if (result.find()) {
            lRetorno = result.group(1);
        }
Run Code Online (Sandbox Code Playgroud)

但是,如果表名称包含架构名称(xyz.table1),我的表达式会带来一切。我的问题是......我需要对此查询进行哪些修改才能只返回没有架构/所有者的表名?

任何帮助将非常感激

拉斐尔·莫伊塔

Psh*_*emo 5

也许可以尝试这样

String data1="SELECT name, age FROM table1 whatever";
String data2="SELECT name, age FROM schema.table1 whatever";

Pattern p=Pattern.compile("from\\s+(?:\\w+\\.)*(\\w+)($|\\s+[WHERE,JOIN,START\\s+WITH,ORDER\\s+BY,GROUP\\s+BY])",Pattern.CASE_INSENSITIVE);

//test
Matcher m=p.matcher(data1);
while(m.find())
    System.out.println(m.group(1));
m=p.matcher(data2);
while(m.find())
    System.out.println(m.group(1));
Run Code Online (Sandbox Code Playgroud)

输出:

table1 
table1 
Run Code Online (Sandbox Code Playgroud)

编辑

我刚刚意识到该部分($|\\s+[WHERE,JOIN,START\\s+WITH,ORDER\\s+BY,GROUP\\s+BY])无法正常工作,因为在我的输入中,我在表名后面放置了“whatever”,但无论如何都找到了它。

它不像你一样工作,因为你正在使用[WHERE,JOIN,START\\s+WITH,ORDER\\s+BY,GROUP\\s+BY]而不是(WHERE|JOIN|START\\s+WITH|ORDER\\s+BY|GROUP\\s+BY). 例如[abc]等于 (a|b|c) 所以它表示正则表达式引擎接受该集合中的任何字符,而不是单词abc。将您的模式改进为类似的

Pattern p=Pattern.compile("from\\s+(?:\\w+\\.)*(\\w+)(\\s*$|\\s+(WHERE|JOIN|START\\s+WITH|ORDER\\s+BY|GROUP\\s+BY))",Pattern.CASE_INSENSITIVE);
Run Code Online (Sandbox Code Playgroud)