Java 正则表达式问题

discolt 2010-01-28 06:00:07
例如这个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

看来是嵌套的问题,有没有正则表达式高手能解决我这个问题。


...全文
136 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
discolt 2010-02-02
  • 打赏
  • 举报
回复
hum 很牛啊 , 原来可以这样简单
join ([^()]+)*? on"
discolt 2010-02-02
  • 打赏
  • 举报
回复
分肯定有的
discolt 2010-02-02
  • 打赏
  • 举报
回复
按你的思路问题解决了,\q \e表示单词的首尾
String regex = "\\bjoin\\b\\s" + "([^()^(\\Qjoin\\E)]+) " + "on";

[Quote=引用 7 楼 wlcacc 的回复:]
哎。今天搞了一天也没找到解决办法,我也不回写,
不过你看这样写的话,能蒙混过关不?
拿个分真不容易啊。

String regex = "[.]*join ([^ ]+ [^ ]+) on ";
[/Quote]


humanity的思路貌似更好,研究一下。
humanity 2010-01-31
  • 打赏
  • 举报
回复
正则表达式有贪婪和非贪婪的匹配选项,你的写法是贪婪的,所以它会尽可能”贪婪“地查找最大的匹配,而实际上我们希望找到一个最短的表名表达式就停下来,所以改成这样,注意 (.*?) 其中我在 * 后面加了'?',意思是非贪婪地匹配(找到一个满意的就不要再考虑后面的):

table(.*?)(?=\s*(left outer join|on)\s*)
wlcacc 2010-01-30
  • 打赏
  • 举报
回复
哎。今天搞了一天也没找到解决办法,我也不回写,
不过你看这样写的话,能蒙混过关不?
拿个分真不容易啊。

String regex = "[.]*join ([^ ]+ [^ ]+) on ";
discolt 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wlcacc 的回复:]
Java codepublicstaticvoid 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));
}
}
-----------------------------------------
([^join^on]+) 意思是join的任意字母,单词怎么表达呢?

输出结果:
Java code
table1 t1
table2 t2
记得那个非join,非On,否则就和你写的匹配结果一样了。
[/Quote]
discolt 2010-01-29
  • 打赏
  • 举报
回复
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";

wlcacc 2010-01-28
  • 打赏
  • 举报
回复

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,否则就和你写的匹配结果一样了。
sing4j 2010-01-28
  • 打赏
  • 举报
回复
String regex="join (.)* on"
greatmind829 2010-01-28
  • 打赏
  • 举报
回复
帮你顶。。
羽蓝 2010-01-28
  • 打赏
  • 举报
回复
帮你顶……

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧