打造自己的正则表达式助手程序

原文地址:http://iregex.org/blog/diy-regexbuddy.html

其实RegexBuddy挺好用的,我一直用它。它的用法、好处,可以写好多文字,本站也做过介绍;不过,也有理由不用它,同时这也是撰写本文的一个原因。我动了动脑筋,花了一点时间,已经做出雏形。现在将思路公布在这里,与各位交流一下。它是收费软件,价格不算便宜。$39.95。Google一下,或有惊喜。

它只能用于Windows平台。虽然在ubuntu下,我会额外安装wine,仅仅是为了驱动RegexBuddy。

Mac下无法使用RegexBuddy。近来我开始使用Mac环境了,不想再为windows软件单独运行环境了。regexbuddy似乎要失之交臂了。搜索了一下,这里,这里,找到的软件聊聊无几,性能也乏善可陈:大多仅支持JavaScript这样比较朴素的正则,缺乏多语言、多选项的支持。RegexBuddy出色的表现,已经将我对正则辅助软件的期望值训练得极为挑剔,一般软件难以落入老夫的法眼了,呵呵。

没有现成的解决方案,我就考虑,如何自己DIY一个了。像RegexBuddy一样,支持以下属性:

支持多语言正则。至少要支持Perl,Python,PHP,JavaScript吧。.Net的用得不多(只在回答别人问题时用过,不算),可以无视;

支持匹配、替换、分割(split);

支持生成代码片段;这一点很重要。我平常不会死背硬记一些电脑可以代劳的冬冬,除非经常用经常用的,慢慢也就变成肌肉记忆了。

除此之外,它最好还能:

兼容于各种常见平台。我指的是,Win/Lin/Mac。

对于语言的支持要原生。说实话,我怀疑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了,原汤化原食就可以。

话说我已经选择了第二套方案,于是就着手实现。已经使用HTML+jQuery画出了简单的界面,实现了perl5.10版的CGI程序,能够进行匹配、替换、分割(Split)。

未实现的功能:代码Snippets自动生成;其它语言版本的实现。

对于我自己来说,基本上已经可以使用了。我现在就正在eatmyowndogfood,一边用它,一边完善它。不过要想发布出来供大家使用,还需要旷日持久的功能完善、界面美化。

截图见文章末尾。

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

useCGI;

my$counter=1;

subcl{

$counter*=-1;

"#ff0"if$counter==1;

"#0ff"if$counter==-1;

}

subh_color

{

my($a)=shift;

$counter*=-1;

$color=($counter".$a."";

}

my$q=CGI->new;

die"$!"unless$q;

print$q->header(-type=>"text/html;charset=UTF-8");

my$regex=$q->param("regex");

#quitimmediatlyifno$regexinput

dieunless$regex;

my$text=$q->param("text");

my$mode=$q->param("mode");

my$x=$q->param("space");

my$action=$q->param("action");

$regex=~s/\s+//gif$x;

if($actioneq"match")

{

my$code="";

$code.='$text=~s@$regex';

$code.='@&h_color($&)';

$code.='@eg'.$mode.';';

eval$code;

$text=~s#\n#

#g;

print$textunless$@;

}

elsif($actioneq"replace")

{

my$code="";

my$replace=$q->param("replace");

$code="\$text=~s:\$regex:$replace:g;";

eval"$code";

$text=~s#\n##g;

print"$text"unless$@;

}

elsif($actioneq"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"$countrecord(s)returned:";';

$code.='print"";';

$code.='print"".&h_color($_).""foreach(@result);';

$code.='print"

《精通正则表达式》豆瓣主页:book.douban.com/subject/2154713/

互动网购买链接:www.china-pub.com/47529

相关推荐