正则表达式求助。:(

dacan66 2012-01-10 11:22:28
Source字符串:

SELECT SUM(OrderTable.HJSL) AS ex, Company.CompanyName
FROM OrderTable INNER JOIN
Company ON OrderTable.CompanyID = Company.CompanyID
WHERE (OrderTable.CompanyID > 1000)
GROUP BY Company.CompanyName
HAVING (SUM(OrderTable.HJJE) > 1000) and sum(company.companyid)>100


其中WHERE语句、GroupBY语句、Having语句是可选项目,可能的情况是:(GroupBY不存在,允许SQL语法错误)

SELECT SUM(OrderTable.HJSL) AS ex, Company.CompanyName
FROM OrderTable INNER JOIN
Company ON OrderTable.CompanyID = Company.CompanyID
WHERE (OrderTable.CompanyID > 1000)
HAVING (SUM(OrderTable.HJJE) > 1000) and sum(company.companyid)>100



需匹配加红项:
SELECT SUM(OrderTable.HJSL) AS ex, Company.CompanyName
FROM OrderTable INNER JOIN
Company ON OrderTable.CompanyID = Company.CompanyID

WHERE (OrderTable.CompanyID > 1000)
GROUP BY Company.CompanyName
HAVING (SUM(OrderTable.HJJE) > 1000) and sum(company.companyid)>100


写了正则:
(?si)SELECT\s+ (?<select>.*?)\s+FROM\s+(?<from>.*?)\s+WHERE\s+(?<where>.*?)\s+GROUP\s+by\s+(?<groupby>.*?)\s+Having\s+(?<having>.*?)\s+$

虽然解决了所有可选项目都存在的情况,
但是去掉任意一个可选项目,便得不到结果,
发帖求助。

正则新人~望谅
...全文
101 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dacan66 2012-01-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 return_false 的回复:]

正则的目的是根据提供的字符串取出相应的内容,至于在SQL里面是否是正确的语法,还要另作判断
[/Quote]
嗯,我也是这么想的,
不进行语法检测,只提炼内容,
不过我希望,正则能在这个语句不包容where的情况下依然能提炼出相应的语句。

当我去掉where后,进行正则匹配的时候,不能获得相应的内容。
现在正在修改你提供的正则语句。
  • 打赏
  • 举报
回复
正则的目的是根据提供的字符串取出相应的内容,至于在SQL里面是否是正确的语法,还要另作判断
dacan66 2012-01-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jiangshun 的回复:]
input=Regex.Replace(input, @"(?is)SELECT|FROM|WHERE|GROUP\s+BY|HAVING", "").Replace(" ","");
[/Quote]
不明白这种操作方式,
希望能讲解下.
dacan66 2012-01-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 return_false 的回复:]

C# code
string pattern = @"(?is)\s*(SELECT\s+(?<select>.*?))?\s+(FROM\s+(?<from>.*?))?\s+(WHERE\s+(?<where>.*?))?\s+(GROUP\s+by\s+(?<groupby>.*?))?\s+(Having\s+(?<having>.*?))?\s+$";
[/Quote]
不行,去掉where后,报错。
koukoujiayi 2012-01-10
  • 打赏
  • 举报
回复
(?is)(?<=select).*(?=from)|(?<=from).*(?=where)|(?<=where).*(?=group by)|(?<=group by).*(?=having)|(?<=having).*
jiangshun 2012-01-10
  • 打赏
  • 举报
回复

input=Regex.Replace(input, @"(?is)SELECT|FROM|WHERE|GROUP\s+BY|HAVING", "").Replace(" ","");
  • 打赏
  • 举报
回复
string pattern = @"(?is)\s*(SELECT\s+(?<select>.*?))?\s+(FROM\s+(?<from>.*?))?\s+(WHERE\s+(?<where>.*?))?\s+(GROUP\s+by\s+(?<groupby>.*?))?\s+(Having\s+(?<having>.*?))?\s+$";
dacan66 2012-01-10
  • 打赏
  • 举报
回复
先结了。。。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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