Java 使用正则表达式从查询中获取表名

Java 使用正则表达式从查询中获取表名,java,regex,Java,Regex,我正在寻找一种模式,以便为这种类型的SQL查询获取表名 INSERT INTO table(uuid,type) VALUES (?,?) 在这里我想要一张“桌子” 我有一个模式,但只有在没有类似括号的情况下才有效 插入表格值(?,) [从|到|更新]\s+(?:\w+)(\w+)(\s$|\s+(其中)) 谢谢 注意:它与中的模式不同,这永远不会是从SQL中提取表名的一种非常简单的方法。但是这里有一个解决问题的方法,使用正则表达式,就像你需要的那样。您已经在提供的表达式中指定了WHERE部分

我正在寻找一种模式,以便为这种类型的SQL查询获取表名

INSERT INTO table(uuid,type) VALUES (?,?)
在这里我想要一张“桌子”

我有一个模式,但只有在没有类似括号的情况下才有效 插入表格值(?,)

[从|到|更新]\s+(?:\w+)(\w+)(\s$|\s+(其中))

谢谢


注意:它与

中的模式不同,这永远不会是从SQL中提取表名的一种非常简单的方法。但是这里有一个解决问题的方法,使用正则表达式,就像你需要的那样。您已经在提供的表达式中指定了WHERE部分,但如果您只需要名称,是否真的需要它

(?is)\b(?:from|into|update)\s+(\w+)
请注意,SQL语句的格式有很多种方法,任何人都不太可能想出一个可以按您需要的方式解析SQL的表达式


正如人们已经提到的,正则表达式不是从SQL查询中提取表名的完整解决方案。。。由于必须考虑大量的事情,在RegX中表达起来会更为棘手,并且在某个或其他情况下会爆发

然后呢??像JSQL解析器这样的完全可靠的sql解析器

如果您只需要从SQLs中提取表名,那么完整的sql解析器将是致命的,而且大多数解析器并不支持所有方言,您可能会根据需要修改语法文件,只是为了提取表名

为此,我编写了一个用于解析来自SQLs的表名的程序,几乎没有80行物理代码,它几乎可以与任何SQL一起工作。
请参阅以了解更多详细信息。

绝对不是傻瓜式的,但可能是一个好的开始:
(?i)(选择加入)(?=(\s+)(\`?)p[A-Za-z0-9$”“]*)(\`?)(\s))
对我来说,引号之间的表名
(?是)\b(?:从|到|更新)\s+(\w+)/code>不起作用,我改为处理引号之间的所有查询,如“table\u name”或“table\u name”或“table\u name”


把所有其他答案和我的用例结合起来

(?ims)\b(?:FROM|JOIN|UPDATE|INTO)\s+(\w+(?:\.\w+)*)
如果您使用postgres或重组表的东西,它也会获取类似于INFORMATION_SCHEMA.TABLES的内容

下面是我用来测试的测试字符串

SELECT columnA, columnB, columnC
FROM (
    SELECT t1.columnA as columnA, t1.columnB as columnB
    FROM table1 t1
    UNION
    SELECT t2.columnA as columnA, t2.columnB as columnB
    from table2 t2
) as tu
left JOIN table3 t3 ON (tu.columnA = t3.columnA)

WITH temporaryTable (averageValue) as
    (SELECT avg(Attr1)
    FROM Table),
    SELECT Attr1
    FROM Table
    WHERE Table.Attr1 > temporaryTable.averageValue;

Select ' Select productid,price'||
         ' from '|| table_name ||
         ' Union' quer
From tabs
Where table_name like 'table%';

Select ' Select productid,price'+
         ' from '+ table_name +
         ' Union' quer
From  INFORMATION_SCHEMA.TABLES 
where table_name  'table%';

Select ' Select productid,price'+
         ' from '+ table_name +
         ' Union' quer
From  INFORMATION_SCHEMA.TABLES.test 
where table_name  'table%';

可能是重复的事实上,我看到了一个,但它不是完全相同的模式你能编辑你的问题,包括一些SQL查询,你目前无法解析的例子吗?很好!我在表名之前添加了对键空间的处理
SELECT columnA, columnB, columnC
FROM (
    SELECT t1.columnA as columnA, t1.columnB as columnB
    FROM table1 t1
    UNION
    SELECT t2.columnA as columnA, t2.columnB as columnB
    from table2 t2
) as tu
left JOIN table3 t3 ON (tu.columnA = t3.columnA)

WITH temporaryTable (averageValue) as
    (SELECT avg(Attr1)
    FROM Table),
    SELECT Attr1
    FROM Table
    WHERE Table.Attr1 > temporaryTable.averageValue;

Select ' Select productid,price'||
         ' from '|| table_name ||
         ' Union' quer
From tabs
Where table_name like 'table%';

Select ' Select productid,price'+
         ' from '+ table_name +
         ' Union' quer
From  INFORMATION_SCHEMA.TABLES 
where table_name  'table%';

Select ' Select productid,price'+
         ' from '+ table_name +
         ' Union' quer
From  INFORMATION_SCHEMA.TABLES.test 
where table_name  'table%';