当前位置: 编程技术>其它
应该如何构造复杂的正则表达式
来源: 互联网 发布时间: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 常用的几种关系比较为:=, , >, =,
避重就轻
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 常用的几种关系比较为:=, , >, =,