Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.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语句:在正则表达式中添加可选标志是否会改变贪婪或posessive修饰符的匹配方式?_Java_Sql_Regex_Regex Greedy_Regex Group - Fatal编程技术网

Java 使用正则表达式解析SQL语句:在正则表达式中添加可选标志是否会改变贪婪或posessive修饰符的匹配方式?

Java 使用正则表达式解析SQL语句:在正则表达式中添加可选标志是否会改变贪婪或posessive修饰符的匹配方式?,java,sql,regex,regex-greedy,regex-group,Java,Sql,Regex,Regex Greedy,Regex Group,我正在使用SQL语法创建一个关系数据库,该数据库将具有一个使用Java的命令行界面。为了解析用户命令,我正在使用正则表达式(我知道这是一个糟糕的想法-它比其他任何东西都更需要学习) 我使用scanner类,分号作为分隔符,所以我不在正则表达式中查找分号。这样它就可以处理多行输入。在与正则表达式匹配之前,会对输入进行修剪,因此字符串开头和结尾的空格不是表达式的一部分 我这里有一个正则表达式,它按照我希望的方式工作,直到我为where子句添加可选标志- select\s+(.*?)(?:\s+whe

我正在使用SQL语法创建一个关系数据库,该数据库将具有一个使用Java的命令行界面。为了解析用户命令,我正在使用正则表达式(我知道这是一个糟糕的想法-它比其他任何东西都更需要学习)
我使用scanner类,分号作为分隔符,所以我不在正则表达式中查找分号。这样它就可以处理多行输入。在与正则表达式匹配之前,会对输入进行修剪,因此字符串开头和结尾的空格不是表达式的一部分

我这里有一个正则表达式,它按照我希望的方式工作,直到我为where子句添加可选标志-

select\s+(.*?)(?:\s+where(.*))
这将匹配(组以粗体显示)——

从*中选择a,其中x=3

但是如果我把正则表达式改成这个-

select\s+(.*?)(?:\s+where(.*))?
它只匹配引用的部分-

"select "a from * where x = 3
我的目标是让它匹配所有内容,直到单词“select”(包括空格字符)后面的字符串结束,除非前面有一个字符串“where”,后面有任何空格字符。如果存在,则将每个字符分组在单词“select”和“where”之间,并将所有字符分组在单词“where”之后

例如: 如果输入此文本:

select a from * where b = 3
它应该将“a from*”和“b=3”分组

但如果这是输入:

select a where x = 3
表名“a”应该是一个组,where子句“x=3”应该是一个组


需要注意的是,我使用的是java.util.regex-它没有Perl regex中的if/else子句,但是组中带有或语句的lookaheads可以用于相同的效果。我可以使用另一个支持if/then/else语句的库,但我想不出我可以使用它来实现我想要的结果。

使用正则表达式解析SQL与。换句话说,这是行不通的。这是一项没有希望的任务,马上停止

相反,使用一些SQL解析器。例如,对于Perl或Java


另外,由于您正在创建自己的数据库,因此值得一看其他SQL实现是如何做到这一点的。我建议您阅读或的源代码,看看它们是如何实现高级SQL解析的。

使用正则表达式解析SQL与。换句话说,这是行不通的。这是一项没有希望的任务,马上停止

相反,使用一些SQL解析器。例如,对于Perl或Java


另外,由于您正在创建自己的数据库,因此值得一看其他SQL实现是如何做到这一点的。我建议您阅读or的源代码,看看它们是如何实现高级SQL解析的。

不过,我的目标是学会自己解析它——没有ANTLR,还有其他方法可以做到这一点吗?我想我会去看看ANTLR的源代码(如果有的话),看看它是如何工作的,并可能将其纳入我的项目中。我肯定还会看看PostgreSQL和MySQL——谢谢!不过,我的目标是学会自己解析它——没有ANTLR,还有其他方法可以做到这一点吗?我想我会去看看ANTLR的源代码(如果有的话),看看它是如何工作的,并可能将其纳入我的项目中。我肯定还会看看PostgreSQL和MySQL——谢谢!