gpt4 book ai didi

java - 使用正则表达式 : Does adding the optional flag in a regex expression change how greedy or posessive modifiers are matched? 解析 SQL 语句

转载 作者:太空宇宙 更新时间:2023-11-04 07:25:35 31 4
gpt4 key购买 nike

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

我这里有这个正则表达式,它按照我想要的方式工作,直到我为 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 正则表达式中的 if/else 子句,但组内带有 or 语句的前瞻可以达到相同的效果。我可以使用另一个支持 if/then/else 语句的库,但我不知道我可以使用它来实现我正在寻找的结果。

最佳答案

用正则表达式解析SQL与parsing HTML with regex没有太大区别。换句话说,它不会起作用。这是无望的任务,立即停止。

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

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

关于java - 使用正则表达式 : Does adding the optional flag in a regex expression change how greedy or posessive modifiers are matched? 解析 SQL 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18604868/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com