网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计资源 > 正则表达式 > 正文

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

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务
句,那么复合语句C就是 C =~ S(?:(?:or|and) S)*?/。至此,一个初具规模的条件语句解析器就诞生了。下面以python为例,一步一步实现出来。

Python实现
重申一句:虽然给出了实现,但是仍请注重思路,忽略代码。
复制代码 代码如下:
#!/usr/bin/python
# -*- coding: utf-8 -*-
#
#author: rex
#blog: http://iregex.org
#filename test.py
#created: 2010-08-06 17:12

#generage quoted string;
#including '' and " string
#allow \'' and \" inside
index=0
def gen_quote_str():

global index
index+=1
char=chr(96+index)
return r"""(?P<quote_%s>[''"])(?:\\[''"]|[^''"])*?(?P=quote_%s)"""% (char, char)


#simple variable
def a():
return r''[\w.`]+''

#operators
def op():
return r''(?:[<>=]{1,2}|Between|Like|In)''


#list item within (,)
#eg: ''a'', 23, a.b, "asdfasdf\"aasdf"
def item():
return r"(?:%s|%s)" % (a(), gen_quote_str())


#a complite list, like
#eg: (23, 24, 44), ("regex", "is", "good")
def items():
return r"""\( \s*
%s
(?:,\s* %s)* \s*
\)""" % (item(), item())

#simple comparison
#eg: a=15 , b>23
def s():
return r"""%s \s* %s \s* (?:\w+| %s | %s )""" % (a(), op(), gen_quote_str(), items())

#complex comparison
# name like ''zhang%'' and age>23 and work in ("hr", "it", ''r&d'')
def c():
return r"""
(?ix) %s
(?:\s*
(?:and|or)\s*
%s \s*
)*
""" % (s(), s())

print "A:\t", a()
print "OP:\t", op()
print "ITEM:\t", item()
print "ITEMS:\t", items()
print "S:\t", s()
print "C:\t", c()

该代码在我的机器上(Ubuntu 10.04, Python 2.6.5)运行的结果是:
复制代码 代码如下:
A: [\w.`]+
OP: (?:[<>=]{1,2}|Between|Like|In)
ITEM: (?:[\w.`]+|(?P<quote_a>[''"])(?:\\[''"]|[^''"])*?(?P=quote_a))
ITEMS: \( \s*
(?:[\w.`]+|(?P<quote_b>[''"])(?:\\[''"]|[^''"])*?(?P=quote_b))
(?:,\s* (?:[\w.`]+|(?P<quote_c>[''"])(?:\\[''"]|[^''"])*?(?P=quote_c)))* \s*
\)
S: [\w.`]+ \s* (?:[<>=]{1,2}|Between|Like|In) \s* (?:\w+| (?P<quote_d>[''"])(?:\\[''"]|[^''"])*?(?P=quote_d) | \( \s*
(?:[\w.`]+|(?P<quote_e>[''"])(?:\\[''"]|[^''"])*?(?P=quote_e))
(?:,\s* (?:[\w.`]+|(?P<quote_f>[''"])(?:\\[''"]|[^''"])*?(?P=quote_f)))* \s*
\) )
C:
(?ix) [\w.`]+ \s* (?:[<>=]{1,2}|Between|Like|In) \s* (?:\w+| (?P<quote_g>[''"])(?:\\[''"]|[^''"])*?(?P=quote_g) | \( \s*
(?:[\w.`]+|(?P<quote_h>[''"])(?:\\[''"]|[^''"])*?(?P=quote_h))
(?:,\s* (?:[\w.`]+|(?P<quote_i>[''"])(?:\\[''"]|[^''"])*?(?P=quote_i)))* \s*
\) )
(?:\s*
(?:and|or)\s*
[\w.`]+ \s* (?:[<>=]{1,2}|Between|Like|In) \s* (?:\w+| (?P<quote_j>[''"])(?:\\[''"]|[^''"])*?(?P=quote_j) | \( \s*
(?:[\w.`]+|(?P<quote_k>[''"])(?:\\[''"]|[^''"])*?(?P=quote_k))
(?:,\s* (?:[\w.`]+|(?P<quote_l>[''"])(?:\\[''"]|[^''"])*?(?P=quote_l)))* \s*
\) ) \s*
)*

请看匹配效果图:



算术表达式

我记得刚才好像提到“为简单起见,这里就不考虑算术表达式了”。不过,解析算术表达式是个非常有趣的话题,只要是算法书,都会提及(中缀表达式转前缀表达式,诸如此类)。当然它也可以使用正则表达式来描述。

其主要思路是:

复制代码 代码如下:
expr -> expr + term | expr - term | term
term -> term * factor | term / factor | factor
设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师