道歉,如果这是重复的话。 我在java中使用regex匹配一个sql字符串。在我的查询中,我可能有也可能没有where子句。
我正在使用以下正则表达式
\bselect\b\s(.*)\s\bfrom\b\s(.+)\s(?:where)?\s(?:(.*))
适用于
select a,b from tab1 where a=b
并且不匹配
select a,b from tab1
如果我添加两个额外的空格匹配。很明显,这是由于我使用了两个\s
。但是,我想让这些也是可选的。
请帮帮我。我无法理解stackoverflow中关于此主题的其他帖子
答案 0 :(得分:1)
将空格放在非捕获组中:
\bselect\b\s(.*)\s\bfrom\b\s(\w+)(?:\swhere\s(.*))?
答案 1 :(得分:1)
不直接回答问题,但在这里使用正则表达式是错误的选择。 SQL是一种语法,因此您提出的任何可以管理所有案例的正则表达式都将变得非常复杂,无法管理。
您应该查看Antlr,这将允许您定义语法并根据您在Java中的任何位置进行操作。甚至还有一个pre-built grammar for SQLite,可以让你很快开始。
答案 2 :(得分:0)
您无需检查匹配是否在单词和的末尾,后面跟一个空格。 +
将匹配至少一个空格,以便匹配额外的空格。 \S
匹配非空格,因此优于.
,它将与空格匹配。
\bselect\s+(\S+)\s+from\s+(\S+)\s*(?:where\s+(\S+))?