我正在尝试编写一个正则表达式,它将挑选出“from”和“where”之间的所有单词(即查询中的天真表名)。
以下不起作用,实际上只是挂起输入而没有“来自”。
"from(?:\\W*|(\\w*))*?where"
回应评论,提出无约束的回溯,改为
"from(?:\\W*+|(\\w*+))*?where"
不再挂起。但是当应用于
时,不匹配“obj”(仅“部分”)select from obj, part where ...
任何人都可以看到它的问题吗?还是更好的方法?代码只是
Matcher match = ckPattern2.matcher(query); // Hangs here.
while (match.find())
for (int gx = 1; gx <= match.groupCount(); gx++)
String ck = match.group(gx); ...
(我的工作就是将其拆分为单词,然后使用程序逻辑进行过滤。但我讨厌被正则表达式打败!)
答案 0 :(得分:1)
这是一个解析问题,而不是扫描问题。您无法使用单个正则表达式解决它。你需要扫描令牌,标点符号和空格,并保留你需要的东西,扔掉你不需要的东西。您将需要标记,标点符号和空格的正则表达式。不只是一个RE。
答案 1 :(得分:0)
这是一个班轮......
String[] tables = query.replaceAll("^.*?\\bfrom\\s+|\\s+where\\s+.*$", "").split("\\W+");
首先删除表名以外的所有内容,然后拆分非单词字符。
下划线被视为&#34;字&#34;正则表达式中的字符,在匹配&#34;单词&#34;时特别方便在SQL的上下文中,下划线通常用于用对象名分隔单词。