我的问题对于你们中的许多人来说应该很简单假设我有以下 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),我的表达式会带来一切。我的问题是......我需要对此查询进行哪些修改才能只返回没有架构/所有者的表名?
任何帮助将非常感激
拉斐尔·莫伊塔
也许可以尝试这样
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)