例如这个SQL语句 select * from table left outer join table1 t1 on id1=xxid1 left outer join table2 t2 on id2=xxid2;
我用
String regex = "\\bjoin\\b?\\s" + TABLE_REGEX +  "\\bon\\b";本想匹配2段 table1 t1 和 table2 t2 
结果匹配到了   join "table1 t1 on id1=xxid1 left outer join table2 t2 " on看来是嵌套的问题,有没有正则表达式高手能解决我这个问题。

解决方案 »

  1.   

    String regex="join (.)* on"
      

  2.   


    public static void testReg1(){
    String ss="select * from table left outer join table1 t1 on id1=xxid1 left outer join table2 t2 on id2=xxid2";
    String regex = "[.]*join ([^join^on]+) on ";
    Pattern p=Pattern.compile(regex);
    Matcher m=p.matcher(ss);
    while(m.find()){ 
      System.out.println(m.group(1)); 

    }
    输出结果:table1 t1
    table2 t2记得那个非join,非On,否则就和你写的匹配结果一样了。
      

  3.   

    String regex = "[.]*join ([^join^on]+) on ";([^join^on]+)  是 匹配单词如果table里有 join里的任意一个便有错了。例如String ss="select * from table left outer join table1o t1 on id1=xxid1 left outer join table2 t2 on id2=xxid2";
      

  4.   

    哎。今天搞了一天也没找到解决办法,我也不回写,
    不过你看这样写的话,能蒙混过关不?
    拿个分真不容易啊。String regex = "[.]*join ([^ ]+ [^ ]+) on ";
      

  5.   

    正则表达式有贪婪和非贪婪的匹配选项,你的写法是贪婪的,所以它会尽可能”贪婪“地查找最大的匹配,而实际上我们希望找到一个最短的表名表达式就停下来,所以改成这样,注意 (.*?) 其中我在 * 后面加了'?',意思是非贪婪地匹配(找到一个满意的就不要再考虑后面的):table(.*?)(?=\s*(left outer join|on)\s*)
      

  6.   

    按你的思路问题解决了,\q \e表示单词的首尾
    String regex = "\\bjoin\\b\\s" + "([^()^(\\Qjoin\\E)]+) " + "on";humanity的思路貌似更好,研究一下。
      

  7.   

    hum 很牛啊 , 原来可以这样简单
    join ([^()]+)*? on"