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

时间:2016-01-18 15:21:11

标签: java regex

我正在寻找一个模式以获取此类SQL查询的表名;

INSERT INTO table(uuid,type) VALUES (?,?)

我希望得到" table"

我有一个模式,但只有在没有括号的情况下它才有效     INSERT INTO表VALUES(?,?)

  

[从|到|更新] \ S +(?:\。W +)的(\ W +)(\ S $ | \ S +(WHERE))

由于

注意:它与get table name from query

中的模式不同

5 个答案:

答案 0 :(得分:3)

这绝不是从SQL中提取表名的非常简单的方法。但是这里是使用你需要的正则表达式解决问题的方法。您已在提供的表达式中指定了WHERE部分,但如果您只需要名称,是否真的有必要?

if (isset($_POST['fruity'])) {
    $start_fruity = new Fruity_draft($_POST);
    echo $start_fruity->get_json_response();
}

class Fruity_draft {

    private $postData;

    function __construct($postData) {
        $this->postData = $postData;
    }

    function get_json_response() {
        return json_encode($this->postData['banned']);
    }
}

请注意,可以通过多种方式格式化SQL语句,并且任何人都不可能想出一个能够以您需要的方式解析SQL的表达式。

Demo

答案 1 :(得分:1)

正如人们已经提到的,正则表达式不是用于从SQL查询中提取表名的完全证明解决方案......因为必须考虑大量事情,这在RegX中表达起来会比较棘手,并且会在一个中突破或其他情况......

那么什么?完整的证明sql解析器,如JSQL解析器?

好吧,如果你只需要从SQL中提取表名,那么完整的sql解析器就会被淘汰,而且大多数解析器都不支持所有的方言,你可能最终会修改你需要的语法文件,只是为了提取表名。

为此,我编写了一个small library来解析来自SQL的表名,几乎没有80行物理代码,它几乎适用于任何SQL。 有关详细信息,请参阅unit test cases

答案 2 :(得分:1)

想出了这个合并所有其他答案和我的用例。

sed 's/2048x2048[^,"]*/2048x2048 +1280+0/g;
     s/1280x1024[^,"]*/1280x1024 +640+0/g;
     s/1920x1080[^,"]*/1920x1080 +0+1024/g' /etc/X11/xorg.conf

如果您使用 postgres 或重新组合表格的内容,它还会获取 INFORMATION_SCHEMA.TABLES 之类的内容。

我用来测试的以下测试字符串

(?ims)\b(?:FROM|JOIN|UPDATE|INTO)\s+(\w+(?:\.\w+)*)

答案 3 :(得分:0)

绝对不是万无一失,但可能是一个好的开始:(?i)(SELECT|JOIN)(?=((\s+)(\`?)(?P<entity_name>[A-Za-z0-9_$""]*)(\`?)(\s)))

答案 4 :(得分:0)

对我来说,引号(?is)\b(?:from|into|update)\s+(\w+)之间的表名不起作用,我改为对所有查询都起作用,如“ table_name”或“ table_name”或“ table_name”

(?is)\b(?:from|into|update)\s+[|'|"]([^|'|"]+)[`|'|"]