现在的位置: 首页 > 综合 > 正文

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

2013年10月16日 ⁄ 综合 ⁄ 共 3321字 ⁄ 字号 评论关闭

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

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

 

缘由

为什么不用RegexBuddy了

  • 它是收费软件,价格不算便宜。$39.95。Google一下,或有惊喜。
  • 它只能用于Windows平台。虽然在ubuntu下,我会额外安装wine,仅仅是为了驱动RegexBuddy。
  • Mac下无法使用RegexBuddy。近来我开始使用Mac环境了,不想再为windows软件单独运行环境了。regexbuddy似乎要失
    之交臂了。搜索了一下,这里
    这里
    ,找到的软件聊聊无几,性能也乏善可陈:大多仅支持JavaScript
    这样比较朴素的正则,缺乏多语言、多选项的支持。–RegexBuddy出色的表现,已经将我对正则辅助软件的期望值训练得极为挑剔,一般软件难以落入老
    夫的法眼了,呵呵。

没有现成的解决方案,我就考虑,如何自己DIY一个了。

我理想中的正则辅助软件

  1. 像RegexBuddy一样,支持以下属性:
    1. 支持多语言正则。至少要支持Perl, Python, PHP,
      JavaScript吧。.Net的用得不多(只在回答别人问题时用过,不算),可以无视;
    2. 支持匹配、替换、分割(split);
    3. 支持生成代码片段;这一点很重要。我平常不会死背硬记一些电脑可以代劳的冬冬,除非经常用–经常用的,慢慢也就变成肌肉记忆了。
  2. 除此之外,它最好还能:
    1. 兼容于各种常见平台。我指的是,Win/Lin/Mac。
    2. 对于语言的支持要原生。说实话,我怀疑RegexBuddy还在用Perl5.8风格的正则。5.10中的许多新奇好用的特性,还没有在
      RegexBuddy中得到支持。究其原因,RegexBuddy的作者大概是自行从头构建的Perl等正则引擎,在细节、版本上,与最新版有所差异。说
      到语言,想起余晟老师的一点意见,就是思考正则问题时,先不要考虑是什么语言、版本的正则,心中要有统一的语法。我同意余老师的观点,但是也觉得,在了解
      了貌似通用的正则语法基础之后,应该比较清晰地了解自己最常用的正则语言的语法细节,以及与其它语言的差异,以避免似是而非。跑题,打住。
    3. 开源,正版,免费。我们向其他人介绍正则,总得有一款可以拿得出手的工具吧?免费这条倒是不苛求,话说好软件还是应该有所回报的。

问题是,这么好的软件,到那里去找呢?找不到的话,自己想从头实现,该如何动手呢?

我的思路历程

  • 使用Objective-C来实现。不过,这想法没多久就像萝莉一样被推倒了。Obj-C固然是要学的,但我等不及了。RegexBuddy这类
    的软件我是天天都在用。这个目标似乎比上一条还要临渴掘井。为mac平台开发了,代码至少还要为win/lin单独编译吧?再者,如果用了Obj-C,正
    则引擎怎么办?从头实现?xiaofei说,要实现一个好用的正则引擎,要一个优秀的团队半年的时间。当然,Obj-C也可以调用现成的模块,这也引出了
    我现在的思路。
  • 做成网页程序,前端接收用户输入,后端使用CGI调用服务器上的原生正则引擎(perl、python),匹配、替换后展现在前端。它最大的好处
    是,语言百分百原生,Native;只要网络在,打开浏览器就能用;即使没有网络,本机localhost也可用,而且更快。
    JavaScript/PHP就不必劳驾CGI了,原汤化原食就可以。

话说我已经选择了第二套方案,于是就着手实现。

目前的进度

  • 已经使用HTML+jQuery画出了简单的界面,实现了perl 5.10版的CGI程序,能够进行匹配、替换、分割(Split)。
  • 未实现的功能:代码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
;

}

代码…还算简洁。主要就是接收并简单处理一下各个参数,然后按照不同的动作要求(match/replace/splie)进行相应的动态代码生
成,然后eval执行结果,返回输出。在match/split中,还插入了代码高亮的小功能。基于perl代码的高效紧凑,实现起来倒也不至于冗长。感
cnhacktnt

协助。

截图

  • Photobucket
  • Photobucket
  • Photobucket
  • Photobucket


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



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

抱歉!评论已关闭.