我想找到不在括号里面的from,也就是非嵌套查询里面的from,比如可能的sql如下:
select t,((asdf from asdfasdf as)from(aaa)) from aaa where adf = (select id from adff)
我想得到红色部分的from。
select t,((asdf from asdfasdf as)from(aaa)) from aaa where adf = (select id from adff)
我想得到红色部分的from。
你只是要得到from吗?
那还写什么正则表达式啊
不管它在不在( )里面,不都是from么?有什么区别啊?
//刚学习,有问题一起学习!
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));
}
}
}
我自己写了这样一个正则,但黄色部分的from也会匹配到,因为我不知道怎么在正则里面给括号配对,似乎太复杂。
select t,((asdf from asdfasdf as)from(aaa)) from aaa where adf = (select id from adff)
{
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被替换了,说明只匹配到了它。
select t,((asdf from asdfasdf as)from(aaa)) from aaa where adf = 'nnnn'
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());
}
}
}
再多套几层就不行了,一个正则表达式到底能不能办到哇?
select * from (select a from (select b from (select * from table) as t2) as t1) as t3
变的。由于 Java 的正则表达式不支持递归结构,除非知道嵌套的层数,根据嵌套的层数动态生成
表达式进行匹配,这样是比较复杂的。
我的思路是去找from后面括号的规律,即from后面的括号不能是这样一种情况:
右括号比左括号多一个
所以可以用(?!exp)来进行匹配。
右括号比左括号多一个的表达式: (\([^()]*\))*\)
所以符合要求的正则为:from(?!(\([^()]*\))*\))
我目前发现它似乎没有什么问题?希望大家帮忙提点意见,谢谢了。
from(?!([^()]*(\([^()]*\)[^()]*)*\)))
程序员在深圳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
——————————————————————————————————————————
希望大家不要认为群能给你带来什么,这只是一个平台,让同等水平的程序员有个交流的机会或许能得到一点信息或许能带来一点启发。*****************************************************************************
程序员在深圳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
——————————————————————————————————————————
希望大家不要认为群能给你带来什么,这只是一个平台,让同等水平的程序员有个交流的机会或许能得到一点信息或许能带来一点启发。*****************************************************************************
结贴,感谢大家。