对.net的正则表达式,时有耳闻,但因为工作没有这方面的接触,一直没有对它进行了解。刚好这星期经理让我完成一个解析Sql字符串的功能,需要用到正则表达式,以下是我对工作过程的一些描述,从中可以得到一些正则表达式的使用经验。


工作任务描述


作查询的时候我们经常要根据用户的输入或选择结果构造相应的查询字符串,有时还会涉及较
复杂的情况,如某个选择项本来没有‘全部’这一项,但我们为了让用户能查询到全部的情况
还要进行特殊的处理,而这些处理模式是重复的,但具体细节繁琐而不可复制。

如果能将查询字符串写成类似:
select *
from  dbo.TB_Dict
where  Del_Flag={0} and Dict_Name<>'{1}' and Dict_ID>{2}  and Dict_ID<{3} or Dict_Value='固定'
然后我们按顺序传入对应数值,不管这些数值来自用户选择或输入的结果还是来自我们自己的设置都没区别.但有些选项当满足某些条件是应该去掉的.如第二个参数如果等于'全部'的时候,这个过滤条件就应该去除.所以我们需要传入一个模式匹配选项,以决定我们什么时候该去除它们,这就是字符串分析要完成的.

最基本的正则表达式知识:
\s 匹配在字符串任意空白字符(例如空格或制表符)的所有匹配项
*表示它前面的项目(\s)可以有零个或多个匹配,也就是说这里既可以没有空格,也可以有多个空格
[]匹配其中的单个字符
[“”’]匹配这两个字符:双引号或者单引号。由于双引号在C#里有特殊含义,因此需要以两个双引号的形式来表示单个双引号
?表示它前面的项目([“”’])可以有一个或多个匹配,与*的用法相似
\w任何单个字符
\w+任何字符组

首先需要将过滤条件逐条匹配出来
匹配项正则表达式的构造:
第一阶段成果:
(AND|OR)*\s*(NOT)?\s*[(]*\s*(\w+)[.]*(\w+)\s*(=|LIKE)\s*('%)*({)\d*(})(%')*\s*[)]*
第二阶段成果:
(AND|OR)*\s*(NOT)?\s*[(]*\s*(\w+)[.]*(\w+)\s*(=|LIKE)\s*('|'%)*({)\d*(})(%'|')*\s*[)]*
第三阶段成果:
(AND|OR)*\s*(NOT)?\s*[(]*\s*(\w+)[.]*(\w+)\s*(=|>|<|>=|<=|<>|LIKE)\s*('|'%)*({)\d*(})(%'|')*\s*[)]*

找到匹配项之后的事情:

1将无效括号去掉==============>类似(((),不能都去掉,只能循环去掉(),用:(\()\s*(\))
2将无效having 去掉===========>类似
3将无效where+全空的情况去掉
4将无效where+and or情况去掉     (同下)
5将无效where +(( and 情况更正===>类似WHERE ((AND WHIC=OERU,用:WHERE\s*(\()*(AND|OR)+(注意不能仅仅替换成"where" ,即不能把括号去掉)
5将无效where +having 情况去掉(where后全是空格,则where清空,where后是group by 则仍要清空)
5将无效having +and or情况去掉(类似where)
WHERE\s*(\w+)(group)*

心得:
(1)?匹配尽可能少的前项

(AND|OR)*\s*(NOT)?\s*[(]?\s*(\w+)[.]*(\w+)\s*(=|LIKE)\s*('%)*({)\d*(})(%')*\s*[)]?
去匹配 WHERE 1=1 AND ((DictItems.ItemTypeID = {2}) AND (Product.ProductClass = 3))
找到的匹配项是(DictItems.ItemTypeID = {2})
去匹配WHERE 1=1 AND (DictItems.ItemTypeID = {2}) AND (Product.ProductClass = 3)
才能得到AND (DictItems.ItemTypeID = {2})
(2)('%)*与('|'%)的区别
如果使用('%)*去匹配'%abcd%',可以,但匹配'%abcd'就不行了
(3)可以用@"\s{2,}"去匹配两个以上的空格,但是如果有回车符/n,则/n也会被包含在匹配的字符串
内,如果用正则表达式的替换方法可以去掉,但如果用字符串的replace方法将会由于查找字符串的不
同而失败
(4)待匹配的字符串千万不要有超过10个的连续空串,否则将大大降低性能
(5)如果把匹配项直接替换成空是不可以的,有时要保留关键字,而括号是一定要保留的
(6)可以安装Expresso,以检验正则表达式并辅助构造正则表达式,很方便

全部步骤:
第一步:将标记出的各个有{}的条件在去除括号后全部去除
第二步:将where两种情况:where +(and    where +     +having   去除括号后更正
第三步:将having 类似where的两种情况 更正
第四步:将无效的空格去掉

posted on 2005-05-04 17:18  邓忠坚  阅读(123)  评论(0编辑  收藏  举报