棘手的Java正则表达式来自..其中

时间:2016-08-10 01:20:27

标签: java regex

我正在尝试编写一个正则表达式,它将挑选出“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); ...

(我的工作就是将其拆分为单词,然后使用程序逻辑进行过滤。但我讨厌被正则表达式打败!)

2 个答案:

答案 0 :(得分:1)

这是一个解析问题,而不是扫描问题。您无法使用单个正则表达式解决它。你需要扫描令牌,标点符号和空格,并保留你需要的东西,扔掉你不需要的东西。您将需要标记,标点符号和空格的正则表达式。不只是一个RE。

答案 1 :(得分:0)

这是一个班轮......

String[] tables = query.replaceAll("^.*?\\bfrom\\s+|\\s+where\\s+.*$", "").split("\\W+");

首先删除表名以外的所有内容,然后拆分非单词字符。

下划线被视为&#34;字&#34;正则表达式中的字符,在匹配&#34;单词&#34;时特别方便在SQL的上下文中,下划线通常用于用对象名分隔单词。