打造自己的正则表达式助手程序(转)
2010-07-01 13:47
211 查看
原文链接:http://iregex.org/blog/diy-regexbuddy.html
其实RegexBuddy挺好用的,我一直用它。它的用法、好处,可以写好多文字,本站也做过介绍;不过,也有理由不用它,同时这也是撰写本文的一 个原因。我动了动脑筋,花了一点时间,已经做出雏形。现在将思路公布在这里,与各位交流一下。
它只能用于Windows平台。虽然在ubuntu下,我会额外安装wine,仅仅是为了驱动RegexBuddy。
Mac下无法使用RegexBuddy。近来我开始使用Mac环境了,不想再为windows软件单独运行环境了。regexbuddy似乎要失 之交臂了。搜索了一下,这里,这里,找到的软件聊聊无几,性能也乏善可陈:大多仅支持JavaScript 这样比较朴素的正则,缺乏多语言、多选项的支持。–RegexBuddy出色的表现,已经将我对正则辅助软件的期望值训练得极为挑剔,一般软件难以落入老 夫的法眼了,呵呵。
没有现成的解决方案,我就考虑,如何自己DIY一个了。
代码…还算简洁。主要就是接收并简单处理一下各个参数,然后按照不同的动作要求(match/replace/splie)进行相应的动态代码生 成,然后eval执行结果,返回输出。在match/split中,还插入了代码高亮的小功能。基于perl代码的高效紧凑,实现起来倒也不至于冗长。感 谢cnhacktnt的 协助。
《精通正则表达式》豆瓣主页:book.douban.com/subject /2154713/
互动网购买链接:www.china-pub.com/47529
其实RegexBuddy挺好用的,我一直用它。它的用法、好处,可以写好多文字,本站也做过介绍;不过,也有理由不用它,同时这也是撰写本文的一 个原因。我动了动脑筋,花了一点时间,已经做出雏形。现在将思路公布在这里,与各位交流一下。
缘由
为什么不用RegexBuddy了
它是收费软件,价格不算便宜。$39.95。Google一下,或有惊喜。它只能用于Windows平台。虽然在ubuntu下,我会额外安装wine,仅仅是为了驱动RegexBuddy。
Mac下无法使用RegexBuddy。近来我开始使用Mac环境了,不想再为windows软件单独运行环境了。regexbuddy似乎要失 之交臂了。搜索了一下,这里,这里,找到的软件聊聊无几,性能也乏善可陈:大多仅支持JavaScript 这样比较朴素的正则,缺乏多语言、多选项的支持。–RegexBuddy出色的表现,已经将我对正则辅助软件的期望值训练得极为挑剔,一般软件难以落入老 夫的法眼了,呵呵。
没有现成的解决方案,我就考虑,如何自己DIY一个了。
我理想中的正则辅助软件
像RegexBuddy一样,支持以下属性:
支持多语言正则。至少要支持Perl, Python, PHP, JavaScript吧。.Net的用得不多(只在回答别人问题时用过,不算),可以无视;
支持匹配、替换、分割(split);
支持生成代码片段;这一点很重要。我平常不会死背硬记一些电脑可以代劳的冬冬,除非经常用–经常用的,慢慢也就变成肌肉记忆了。
除此之外,它最好还能:支持多语言正则。至少要支持Perl, Python, PHP, JavaScript吧。.Net的用得不多(只在回答别人问题时用过,不算),可以无视;
支持匹配、替换、分割(split);
支持生成代码片段;这一点很重要。我平常不会死背硬记一些电脑可以代劳的冬冬,除非经常用–经常用的,慢慢也就变成肌肉记忆了。
兼容于各种常见平台。我指的是,Win/Lin/Mac。
对于语言的支持要原生。说实话,我怀疑RegexBuddy还在用Perl5.8风格的正则。5.10中的许多新奇好用的特性,还没有在 RegexBuddy中得到支持。究其原因,RegexBuddy的作者大概是自行从头构建的Perl等正则引擎,在细节、版本上,与最新版有所差异。说 到语言,想起余晟老师的一点意见,就是思考正则问题时,先不要考虑是什么语言、版本的正则,心中要有统一的语法。我同意余老师的观点,但是也觉得,在了解 了貌似通用的正则语法基础之后,应该比较清晰地了解自己最常用的正则语言的语法细节,以及与其它语言的差异,以避免似是而非。跑题,打住。
开源,正版,免费。我们向其他人介绍正则,总得有一款可以拿得出手的工具吧?免费这条倒是不苛求,话说好软件还是应该有所回报的。
问题是,这么好的软件,到那里去找呢?找不到的话,自己想从头实现,该如何动手呢?对于语言的支持要原生。说实话,我怀疑RegexBuddy还在用Perl5.8风格的正则。5.10中的许多新奇好用的特性,还没有在 RegexBuddy中得到支持。究其原因,RegexBuddy的作者大概是自行从头构建的Perl等正则引擎,在细节、版本上,与最新版有所差异。说 到语言,想起余晟老师的一点意见,就是思考正则问题时,先不要考虑是什么语言、版本的正则,心中要有统一的语法。我同意余老师的观点,但是也觉得,在了解 了貌似通用的正则语法基础之后,应该比较清晰地了解自己最常用的正则语言的语法细节,以及与其它语言的差异,以避免似是而非。跑题,打住。
开源,正版,免费。我们向其他人介绍正则,总得有一款可以拿得出手的工具吧?免费这条倒是不苛求,话说好软件还是应该有所回报的。
我的思路历程
使用Objective-C来实现。不过,这想法没多久就像萝莉一样被推倒了。Obj-C固然是要学的,但我等不及了。RegexBuddy这类 的软件我是天天都在用。这个目标似乎比上一条还要临渴掘井。为mac平台开发了,代码至少还要为win/lin单独编译吧?再者,如果用了Obj-C,正 则引擎怎么办?从头实现?xiaofei说,要实现一个好用的正则引擎,要一个优秀的团队半年的时间。当然,Obj-C也可以调用现成的模块,这也引出了 我现在的思路。
做成网页程序,前端接收用户输入,后端使用CGI调用服务器上的原生正则引擎(perl、python),匹配、替换后展现在前端。它最大的好处 是,语言百分百原生,Native;只要网络在,打开浏览器就能用;即使没有网络,本机localhost也可用,而且更快。 JavaScript/PHP就不必劳驾CGI了,原汤化原食就可以。
话说我已经选择了第二套方案,于是就着手实现。
做成网页程序,前端接收用户输入,后端使用CGI调用服务器上的原生正则引擎(perl、python),匹配、替换后展现在前端。它最大的好处 是,语言百分百原生,Native;只要网络在,打开浏览器就能用;即使没有网络,本机localhost也可用,而且更快。 JavaScript/PHP就不必劳驾CGI了,原汤化原食就可以。
话说我已经选择了第二套方案,于是就着手实现。
目前的进度
已经使用HTML+jQuery画出了简单的界面,实现了perl 5.10版的CGI程序,能够进行匹配、替换、分割(Split)。
未实现的功能:代码Snippets自动生成;其它语言版本的实现。
对于我自己来说,基本上已经可以使用了。我现在就正在 eat my own dog food,一边用它,一边完善它。不过要想发布出来供大家使用,还需要旷日持久的功能完善、界面美化。
截图见文章末尾。
未实现的功能:代码Snippets自动生成;其它语言版本的实现。
对于我自己来说,基本上已经可以使用了。我现在就正在 eat my own dog food,一边用它,一边完善它。不过要想发布出来供大家使用,还需要旷日持久的功能完善、界面美化。
截图见文章末尾。
Perl CGI 代码以及简要说明
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #!/usr/bin/perl -w use CGI; my $counter=1; sub cl { $counter*=-1; "#ff0" if $counter==1; "#0ff" if $counter==-1; } sub h_color { my ($a)=shift; $counter*=-1; $color=($counter<0) ? "#ff0" : "#0ff"; "<span style='background-color:$color'>".$a."</span>"; } my $q=CGI->new; die "$!" unless $q; print $q->header(-type=>"text/html; charset=UTF-8"); my $regex=$q->param("regex"); #quit immediatly if no $regex input die unless $regex; my $text=$q->param("text"); my $mode=$q->param("mode"); my $x=$q->param("space"); my $action=$q->param("action"); $regex =~ s/\s+//g if $x; if ($action eq "match") { my $code=""; $code.='$text =~ s@$regex'; $code.='@&h_color($&)'; $code.='@eg'.$mode.';'; eval $code; $text =~ s#\n#<br />#g; print $text unless $@; } elsif ($action eq "replace") { my $code=""; my $replace=$q->param("replace"); $code = "\$text =~ s:\$regex:$replace:g;"; eval "$code"; $text =~ s#\n#<br/>#g; print "<pre>$text</pre>" unless $@; } elsif ($action eq "split") { #@result=split(m@$regex@mode, $text); my $code=""; $code .= '@result=split(m@$regex@'. $mode . ', $text);'; $code .= '@result=grep /\S/, @result;'; $code .= 'my $count=@result;'; $code .= 'print "<font color=\"#ff008c\">$count</font> record(s) returned:";'; $code .= 'print "<ol>";'; $code .= 'print "<li>".&h_color($_)."</li>" foreach (@result);'; $code .= 'print "</ol";'; eval $code; } |
截图
《精通正则表达式》豆瓣主页:book.douban.com/subject /2154713/
互动网购买链接:www.china-pub.com/47529
相关文章推荐
- 自己动手写一个判断网址合法的C/C++的正则表达式程序
- 自己动手写一个轻巧,高效的正则表达式引擎
- Linux07--Shell程序设计03 通配符与正则表达式
- [30期] PHP正则表达式写天气预报小偷程序
- [.net 面向对象程序设计进阶] (4) 正则表达式 (三) 表达式助手
- [linux学习笔记]第3天:变量分类,重定向,管道命令,程序执行流,文本处理类命令, 正则表达式,短路操作符
- 04 Python正则表达式 爬虫程序 变量的引用,浅拷贝,深拷贝 多线程 进程锁 数据库模块
- 求助:编写一个程序,输入一个文法,输出其正则表达式。
- 正则表达式简单的检查输入email是否合法程序
- 打造属于自己的正则表达式
- 利用正则表达式抓取网页上邮箱的小程序
- 用PHP程序为自己网站打造一个搜索引擎
- java程序小例子8-正则表达式
- PHP程序中正则表达式的使用
- 自己总结的JS正则表达式
- 浅谈正则表达式在.net的运用-C#程序抓取网页信息
- 详解一个自己原创的正则匹配IP的表达式
- 自己写的python正则表达式
- 每天一个小程序—0013题(爬图片+正则表达式 or BeautifulSoup)
- 分享一个不错的正则表达式在线测试程序