具有挑战性的正则表达式问题,我有15000分

gypb 2006-06-29 10:54:02
有如下sql

select * from (select * from tablea) a,(select * from table b) b,
tablec c,tabled e
where a.key = b.key and b.key = c.key and c.key = e.key

要求提取出 from 后的表名和 表别名,包括子查询
例如返回结果
select * from tablea ,别名 a
select * from table b , b
tablec c
tabled e
...全文
684 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
gypb 2006-07-26
  • 打赏
  • 举报
回复
之所以需要实现这个功能,是因为我要写个query 设计器,我的分这么多,是因为csdn刚刚创建时,我就是论坛的用户了
MyLf 2006-07-22
  • 打赏
  • 举报
回复
select * from (select * from tablea) a,(select * from table b) b ??

这和
select * from tablea a,b
有什么区别?

为何要那样写呢?

select * from (select * from (select * from a) a) a ??

没事干么?
速马 2006-07-19
  • 打赏
  • 举报
回复
正则表达式并不适合做复杂的语法/词法分析
用这个吧:
http://www.antlr.org/

关于SQL语句的解析,已经有很多现成的语法文件了
bsonlinedown 2006-07-19
  • 打赏
  • 举报
回复
请教一下,如何有这么多的分?

http://blog.xdnice.com/user1/87/archives/2005/7554.shtml
Andfly 2006-07-17
  • 打赏
  • 举报
回复
这么多?150米问问题?
kssys 2006-07-13
  • 打赏
  • 举报
回复
这么多分!!!哪来的
kssys 2006-07-13
  • 打赏
  • 举报
回复
451
tiaoci 2006-07-13
  • 打赏
  • 举报
回复
427 的 userid 还问这种问题,做人失败啊
mobydick 2006-07-13
  • 打赏
  • 举报
回复
递归。
低调的小青蛙 2006-07-13
  • 打赏
  • 举报
回复
如果表达式引擎不支持递归,那么只能采用文章
http://www.regexlab.com/zh/regtopic.htm
中所讲到的方法,进行有限层次的递归。

那么,表达式看起来比较复杂,并且只支持有限层次递归:
(?:,|from\b)\s*(\((?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()])*\))*\))*\))*\))*\))*\))*\))*\))*\)|[\w.]+)\s+([\w.]+)

阅读这个表达式,是一件痛苦的事情,因此,请直接看测试页面:(推荐)

http://www.regexlab.com/zh/workshop.asp?pat=%28%3F%3A%2C%7Cfrom%5Cb%29%5Cs*%28%5C%28%28%3F%3A%5B%5E%28%29%5D%7C%5C%28%28%3F%3A%5B%5E%28%29%5D%7C%5C%28%28%3F%3A%5B%5E%28%29%5D%7C%5C%28%28%3F%3A%5B%5E%28%29%5D%7C%5C%28%28%3F%3A%5B%5E%28%29%5D%7C%5C%28%28%3F%3A%5B%5E%28%29%5D%7C%5C%28%28%3F%3A%5B%5E%28%29%5D%7C%5C%28%28%3F%3A%5B%5E%28%29%5D%7C%5C%28%28%3F%3A%5B%5E%28%29%5D%29*%5C%29%29*%5C%29%29*%5C%29%29*%5C%29%29*%5C%29%29*%5C%29%29*%5C%29%29*%5C%29%29*%5C%29%7C%5B%5Cw.%5D%2B%29%5Cs%2B%28%5B%5Cw.%5D%2B%29&txt=select%20*%20from%20%28select%20*%20from%20%28select%20*%20from%20a%29%20a%29%20a%0D%0A%0D%0Aselect%20*%20from%20%28select%20*%20from%20tablea%29%20a%2C%28select%20*%20from%20table%20b%29%20b%2C%0D%0Atablec%20c%2Ctabled%20e%0D%0Awhere%20a.key%20%3D%20b.key%20and%20b.key%20%3D%20c.key%20and%20c.key%20%3D%20e.key&dlt=0

如果表达式引擎支持递归,那么这个表达式会简单些。

关于这个长表达式所利用到的思路,请看文章:
http://www.regexlab.com/zh/regref.htm
李世垚 2006-07-07
  • 打赏
  • 举报
回复
搂主要的是正则表达式哟
我也想学学
lovcal 2006-07-06
  • 打赏
  • 举报
回复
这个问题好像在SQLServer版见过啊

又在搞词法分析器啊?

分别从From 匹配和() 匹配入手
copall 2006-07-03
  • 打赏
  • 举报
回复
frank_lee_cn(我通常很快结帖,希望你也是) ( ) 信誉:100 2006-6-29 11:45:22 得分: 0



哪来的 15000 分﹖






<PostUserId>427</PostUserId>
<PostUserName>gypb</PostUserName>

楼主强~~~~~~~~~~~~~~~~~~~~~~~~~~~~
oldcsdn 2006-06-30
  • 打赏
  • 举报
回复
string query = @"select * from (select * from tablea) a,(select * from table b) b,
tablec c,tabled e
where a.key = b.key and b.key = c.key and c.key = e.key";

int idx = query.IndexOf("where");
string tableStr = query.SubString(query.IndexOf("select"),idx);
string[] tables =tableStr.Split(new char[]{','});


string tablea = tables[0].replace(" ",",");
string tableb = tables[1].replace(" ",",");
string tablec = tables[2].replace(" ",",");
string tabled = tables[3].replace(" ",",");
即可
JasonHeung 2006-06-29
  • 打赏
  • 举报
回复
先用From + Where提取;
再用逗号分割;
再用)加空格分隔;
搞定!
Frank6600 2006-06-29
  • 打赏
  • 举报
回复
哪来的 15000 分﹖
wcj86009 2006-06-29
  • 打赏
  • 举报
回复
学习
gypb 2006-06-29
  • 打赏
  • 举报
回复
大家注意 sql的子查询可以嵌套,比如

select * from (select * from (select * from a) a) a
返回的是

(select * from (select * from a) a) a

13,190

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 分析与设计
社区管理员
  • 分析与设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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