我想找到不在括号里面的from,也就是非嵌套查询里面的from,比如可能的sql如下:
select t,((asdf from asdfasdf as)from(aaa)) from aaa where adf = (select id from adff)
我想得到红色部分的from。

解决方案 »

  1.   

    晕啊
    你只是要得到from吗?
    那还写什么正则表达式啊
    不管它在不在( )里面,不都是from么?有什么区别啊?
      

  2.   

    回1楼的,我需要的是那个特定的from,红色的。
      

  3.   


    //刚学习,有问题一起学习!
    package zhao;import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class Test1 {    public static void main(String[] args) throws Exception {
            String s = "select t,((asdf from asdfasdf as)dsadsadsfromdsadsad(aaa)) from aaa where adf = (select id from adff) ";
            String pattern = "select\\s+\\w+[,]?(.*?)\\s+(from)\\s+(.*?)where(.*?)";
            Pattern p = Pattern.compile(pattern);
            Matcher m = p.matcher(s);
            while (m.find()) {
                System.out.println(m.group(2));
            }
        }
    }
      

  4.   

    (?<!(\([^\)]{0,10000}))from(?!([^\(]{0,10000}\)))
    我自己写了这样一个正则,但黄色部分的from也会匹配到,因为我不知道怎么在正则里面给括号配对,似乎太复杂。
    select t,((asdf from asdfasdf as)from(aaa)) from aaa where adf = (select id from adff) 
      

  5.   

    回4楼的,sql是一个可变字符串,并不一定是那个。还有可能是select * from table
      

  6.   

    import java.util.regex.*;public class Main
    {
    public static void main(String[] args) {
    String sql = "select t,((asdf from asdfasdf as)from(aaa)) from aaa where adf = (select id from adff) ";
    Pattern pat = Pattern.compile("\\sfrom(?=[^\\)]*\\(.*\\)\\s*$)");
    Matcher mat = pat.matcher(sql);
    String s = mat.replaceAll("findFrom"); System.out.println(s);
    }
    }结果:
    select t,((asdf from asdfasdf as)from(aaa))findFrom aaa where adf = (select id f
    rom adff)只有那个标红的from被替换了,说明只匹配到了它。
      

  7.   

    楼上的是找后面有括号的from,但如果后面没有括号则不能匹配。如:
    select t,((asdf from asdfasdf as)from(aaa)) from aaa where adf = 'nnnn'
      

  8.   

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class Test1 {    public static void main(String[] args) {
            String str = "select t,((asdf from asdfasdf as)from(aaa)) from aaa where adf = (select id from adff) ";
            String regex = "from(?![^(]*\\)|[^)]*\\)[^)]*\\))";
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(str);
            while(matcher.find()) {
                System.out.print(matcher.start() + " --> " + matcher.end() + " == ");
                System.out.println(matcher.group());
            }
        }
    }
      

  9.   


    再多套几层就不行了,一个正则表达式到底能不能办到哇?
    select * from (select a from (select b from (select * from table) as t2) as t1) as t3 
      

  10.   

    正则表达式不能处理嵌套结构的,这在正则表达式中是个规矩,而且这个规矩以后也不会改
    变的。由于 Java 的正则表达式不支持递归结构,除非知道嵌套的层数,根据嵌套的层数动态生成
    表达式进行匹配,这样是比较复杂的。
      

  11.   

    搞了许久,我认为这里不需要用到递归,大家可能想复杂了。
    我的思路是去找from后面括号的规律,即from后面的括号不能是这样一种情况:
    右括号比左括号多一个
    所以可以用(?!exp)来进行匹配。
    右括号比左括号多一个的表达式:  (\([^()]*\))*\)
    所以符合要求的正则为:from(?!(\([^()]*\))*\))
    我目前发现它似乎没有什么问题?希望大家帮忙提点意见,谢谢了。
      

  12.   

    我的最后正则表达式:
    from(?!([^()]*(\([^()]*\)[^()]*)*\)))
      

  13.   

    ***************************************************************************思想决定行动,加入程序员在深圳QQ群,参加技术思想碰撞专业分类:
    程序员在深圳JAVA群4247660
    程序员在深圳c++群15195967
    程序员在深圳.NET群Ⅱ:12203296
    程序员在深圳TCP/IP协议栈开发:16956462
    程序员在深圳JS & AJAX群:12578377
    程序员在深圳英语学习群:23864353
    深序员在深圳VB:11055959
    程序员在深圳c++Ⅱ17409451
    程序员在深圳c++群15195967
    程序员在深圳嵌入式开发群37489763
    程序员在深圳移动开发群31501597
    程序员在深圳创业群33653422不限专业分类:
    高级群:17538442
    第三群:2650485
    第五群:29537639
    第四群:28702746
    第六群:10590618
    第七群:10543585
    第八群:12006492
    第九群:19063074
    第十群:2883885
    第十一群:25460595
    第十二群:9663807深圳程序员QQ群联盟成立两年多,拥有三十个以上的QQ群,人数达二千多人,有30%以上的成员的经验丰富的老手,包括国内外顶级大公司的成员(如微软、IBM,SUN,华为)、国内著名高校和研究院成员,和有丰富实践经验的高级程序(包括参加过上亿元的项目的架构师),有很热爱技术的成员(包括自己写过嵌入式操作系统),还有少数女程序员。现推介如下QQ群,如有兴趣速速加入:深程高级群I:17538442 深程高级群II:7120862 (深程高级群不欢迎新手,如果在深圳,月薪6K以下的别加入) c++:15195967 .NET:12203296 mobile:31501597嵌入式:37489763 JAVA:4247660  
    —————————————————————————————————————————— 
    希望大家不要认为群能给你带来什么,这只是一个平台,让同等水平的程序员有个交流的机会或许能得到一点信息或许能带来一点启发。*****************************************************************************
      

  14.   

    ***************************************************************************思想决定行动,加入程序员在深圳QQ群,参加技术思想碰撞专业分类:
    程序员在深圳JAVA群4247660
    程序员在深圳c++群15195967
    程序员在深圳.NET群Ⅱ:12203296
    程序员在深圳TCP/IP协议栈开发:16956462
    程序员在深圳JS & AJAX群:12578377
    程序员在深圳英语学习群:23864353
    深序员在深圳VB:11055959
    程序员在深圳c++Ⅱ17409451
    程序员在深圳c++群15195967
    程序员在深圳嵌入式开发群37489763
    程序员在深圳移动开发群31501597
    程序员在深圳创业群33653422不限专业分类:
    高级群:17538442
    第三群:2650485
    第五群:29537639
    第四群:28702746
    第六群:10590618
    第七群:10543585
    第八群:12006492
    第九群:19063074
    第十群:2883885
    第十一群:25460595
    第十二群:9663807深圳程序员QQ群联盟成立两年多,拥有三十个以上的QQ群,人数达二千多人,有30%以上的成员的经验丰富的老手,包括国内外顶级大公司的成员(如微软、IBM,SUN,华为)、国内著名高校和研究院成员,和有丰富实践经验的高级程序(包括参加过上亿元的项目的架构师),有很热爱技术的成员(包括自己写过嵌入式操作系统),还有少数女程序员。现推介如下QQ群,如有兴趣速速加入:深程高级群I:17538442 深程高级群II:7120862 (深程高级群不欢迎新手,如果在深圳,月薪6K以下的别加入) c++:15195967 .NET:12203296 mobile:31501597嵌入式:37489763 JAVA:4247660  
    —————————————————————————————————————————— 
    希望大家不要认为群能给你带来什么,这只是一个平台,让同等水平的程序员有个交流的机会或许能得到一点信息或许能带来一点启发。*****************************************************************************
      

  15.   

    算了,没有办法了,用java写个方法算了
    结贴,感谢大家。