Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于提取SQL查询的正则表达式_Java_Regex_Matcher - Fatal编程技术网

Java 用于提取SQL查询的正则表达式

Java 用于提取SQL查询的正则表达式,java,regex,matcher,Java,Regex,Matcher,是否有从字符串中提取SQL查询的正则表达式?我对验证任何SQL语法都不感兴趣,而只是提取一些SQL命令。这就要求以灵活的方式解析给定的SQL文件/字符串 给出了以下SQL文件/字符串示例: SELECT * FROM test_table WHERE test_row = 'Testing ; semicolon'; SELECT * FROM another_test_table; INSERT INTO table_name VALUES (

是否有从字符串中提取SQL查询的正则表达式?我对验证任何SQL语法都不感兴趣,而只是提取一些SQL命令。这就要求以灵活的方式解析给定的SQL文件/字符串

给出了以下SQL文件/字符串示例:

SELECT
    *
FROM
    test_table
WHERE
    test_row = 'Testing ; semicolon';

SELECT * FROM another_test_table;

INSERT INTO 
    table_name 
VALUES 
    (value1,'value which contains semicolon ;;;;',value3,...);
一些伪代码示例是:
^(更新|选择|插入到)(*)(;)$
。在将来,我希望用所有(可能的)命令来扩展它

  • 使用以下任一选项查找起始匹配:(更新|选择|插入|插入)
  • 零个或多个
    任何字符
    (包括空格和换行符)
  • 停在
    ,它限定了SQL查询
只要可以通过正则表达式执行此操作,以下java代码就能够提取所有SQL命令:

final String regex = "LOOKING_FOR_THIS_ONE";
final Pattern p = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = p.matcher(content);

while (matcher.find()) {
  // matcher.group() now contains the full SQL command
}
提前谢谢

(?m)^(更新|选择|插入)。*$应该可以工作。这将扩展模式以匹配换行符。它应该能够循环并找到所有SQL


查看您提供的示例,它将匹配您的命令,直到
。您可以看到用于测试的示例。

如果您正在处理一种语言,请创建一个标记字符串的lexer。使用,这是一个词法分析器生成器。它生成一个Java类,该类根据特殊文件中指定的语法将字符串拆分为标记。从中学习相关的语法规则

解析是一个独立于标记化(或词法分析)的过程。如果词法分析还不够,您可能需要在词法分析之后使用解析器生成器。

只要分号是该行的最后一个非空白字符,您就可以“正确”匹配它

final String regex = ^(SELECT|UPDATE|INSERT)[\s\S]+?\;\s*?$

final Pattern p = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = p.matcher(content);

我首先要说的是,这不是一种很好的方法,我强烈要求你找到另一种方法,最好在陈述的地方正确地标注,这样你就不会陷入这种情况

也就是说,SQL要求它从以下之一开始:<代码>删除
选择
使用
更新
插入
。它还要求输入以
结尾

我们可以使用它获取与SQL匹配的所有序列,如下所示:

final String regex = "^(INSERT INTO|UPDATE|SELECT|WITH|DELETE)(?:[^;']|(?:'[^']+'))+;\\s*$";
final Pattern p = Pattern.compile(regex, Pattern.MULTILINE | Pattern.DOTALL);
如果您希望在
UPDATE
SELECT
上筛选有效的SQL,组1现在保存操作字

查看正在运行的正则表达式,以及此处的洞穴:


SQL非常复杂,您需要上下文来查找所有语句,这意味着您无法使用正则表达式来完成此操作

例如:

SELECT Model FROM Product
WHERE ManufacturerID IN (SELECT ManufacturerID FROM Manufacturer 
WHERE Manufacturer = 'Dell')
(示例来自)。嵌套查询可以嵌套多次,从不同的值开始,等等。如果您可以为感兴趣的子集编写正则表达式,那么它将无法读取


有一个可用的(我没有尝试过)。

不要让你的生活变得困难,将查询放在属性文件中(使用任何键),加载它,然后迭代值集。这不是一个可能的解决方案,因为我需要使用我得到的,我不能要求格式作为输入。输入是一个包含SQL命令的文本文件,我需要提取/解析该命令。创建该字符串的人有没有可能包含?对结构化信息使用纯文本并强迫开发人员接受它似乎是一种故意的残忍行为。您的伪代码示例匹配是什么?看起来几乎和其中一个解决方案一模一样,那么什么不起作用呢?regexp不是解析的快捷方式。学习解析。