当前位置:  编程技术>其它

应该如何构造复杂的正则表达式

    来源: 互联网  发布时间:2014-10-17

    本文导语:  文题本来是《如何构造复杂的正则表达式》,但是觉得有些歧义,就感觉正则式本来很简单,我在教人如何将它小事化大一样。正好相反,我的本意是说,即使复杂的正则式也不怕,找出合适的方法,将其构造出来。 避重就...

文题本来是《如何构造复杂的正则表达式》,但是觉得有些歧义,就感觉正则式本来很简单,我在教人如何将它小事化大一样。正好相反,我的本意是说,即使复杂的正则式也不怕,找出合适的方法,将其构造出来。

避重就轻

Snopo给出的文本是这样的:or and name='zhangsan' and id=001 or age>20 or area='%renmin%' and like,问,如何提取其中正确的SQL查询语句。

简要分析可知,中间部分是合乎要求的,只是两端的有若干个like, or, and。构造能够解析合乎SQL语法的查询语句的正则表达式,应该是比较复杂的。可是,对于具体的问题,也可以更简单。上述的不良构的SQL语句,应该是使用程序自动生成的,它的两端会有一些不符合题意的文本。只要将这些文本去除就可以了。

于是,我写出了正则表达式:s/^(?:(?:or|and|like)s*)+|s*(?:(?:or|and|like)s*)+$//mi;,这样就把多行字串首尾的like, or, and以及可能的空白字符全部去掉了,剩下的内容即为所求。

分而治之

答案发过去之后,Snopo显然不是很满意这种“偷懒”的办法。他继续问道,能否写出正则式,用来匹配合符SQL语法要求的条件查询语句?(只考虑where部分即可,不必写完整的select。)

的确,从快速解决问题的角度来说,只要能够行之有效地解决,用什么办法都可以;不过从学习知识的角度来说,不避重就轻,而是刨根问底,才是正途。既如此,就看一下如何使用正则,将该SQL查询语句解决掉。

最简单的查询语句,应该是真假判断,即 where 1; where True; where false,等等。 这样的语句使用正则式,直接/(?:-?d+|True|False)/i。

稍复杂些的单条语句,可以是左右比较,即

代码如下:

name like 'zhang%', 或 age>25 ,或 work in ('it', 'hr', 'R&D')

。将其简单化,结构就变为A OP B。其中A代表变量,OP代表比较操作符,B代表值。

•A: 最简单的A,应该是w+。考虑到实际情况,变量包含点号或脱字符,例如`table.salary`,可以记为/[w.`]+/。这是比较笼统的细化。如果要求比较苛刻,还可以做到让脱字符同时在左右两边出现(条件判断)。
•OP: Where 常用的几种关系比较为:=, , >, =,

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 应该叫做关于调用jsp的问题吧?应该怎么办?
  • 紧急!!!这个问题为什么出错,我想是不应该的啊两个“ON”应该是相同的才对啊结果。。。。。
  • 请问在solaris X86 的安装中,应该如何分区呢?其大小应该如何定呢?可否存在windows和solaris两种系统在一块硬盘上?
  • .deb 应该如何安装?
  • 有一定基础后,请问应该先看Linux内核还是驱动呢?
  • 请问下面一句话应该怎样理解?
  • codeblocks应该怎么用啊
  • TOMCAT中,*.jar类应该放在什么路径下,如何配置?
  • 学习UNIX编程应该从那里入手?
  • winlinux2003的安装应该注意点什么?谢谢
  • 有没有什么办法快速的找出应该包含的头文件?
  • redhat9.0安装应该怎样分区?
  • (求助)准备向linux内核方向发展应该有哪些基础???
  • 问个AIX题库的一道题,感觉答案应该是A啊
  • 驱动移植应该怎么入手
  • makefile这句话应该则怎么理解
  • 学习openGL的话,应该做些什么准备呢? 在线等哦,
  • secureCRT应该怎么连图中的机器
  • 用jrun3执行jsp,那javabean应该放在哪个目录下?
  • 在安装Linux时"键盘设置"应该选哪种类型的呢?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3