EmEditor中的正则表达式

Rex按:原本在翻译EmEditor自带的帮助文件中关于正则表达式的部分,翻译至一半,忽然想搜索一下是否有人已经翻译。结果发现,果然已经有人早已做好。我就不再重复劳动了。

文章来源:【正则表达式专题】正则表达式介绍及其在EmEditor的应用(更新)
作者:nb590

应lyh728之约, 也算是对命令行和正则表达式专题的支持, 随便写点东西介绍下正则表达式的基础概念. 由于本版偏重应用, 故只取EmEditor的正则子集来作介绍. Perl 和 CLR 的 Regex 的内容远比这类编辑器所支持的功能多.

正则表达式实在包含的内容太多, 仅仅用一篇文章来涵盖是没可能的了, 所以我只是简要的做些介绍和基本的模式应用举例. 即使这样也需要多次分章节的来连载了~~~ 闲话少说, 以下正文:

正则表达式, 英文 Regular expression, 简写Regexes或Regex.

应用概述: 提供与预期的搜索结果匹配的确切文本来进行字符串的搜索和替换操作, 这种技术不仅仅用于开发领域, 更被集成到一些常见的文本扩展编辑器, 如UltraEdit, Emeditor等. 历史上第一个实用应用程序是Unix 中的qed 编辑器。

举一个简单的类比: 我们对DOS中的通配符”*”和”?”应该很熟悉, 如命令”dir *.exe” 将列出所有后缀名为exe的文件名. 正则表达式提供的方法与其类似, 而且远比通配符强大的多.

从某种意义上说, 正则表达式是一种语言, 通过及其简短的一行代码即可以高效, 精确的描述要匹配的复杂文本, 当然, 它最大的优点也是他最大的缺点: 语法复杂, 创建困难. (熟悉之后就可以忽略后半句了 )

主要应用:

  • 数据验证; 这是正则表达式在开发中最常见的应用, 通过测试字符串内的模式。来验证输入的字符串是否为邮政编码, 电话号码, 电子邮件地址, 信用卡号码等等。
  • 搜索和替换文本; 用正则表达式来搜索文档中的特定文本块, 根据需要用其他指定的文本块进行替换。这也是文本编辑中的一个常见应用, 如将网页中的HTML代码转化为UBB代码.

既然发在『软件使用』板, 正则表达式的开发中的应用就不介绍了, 以下仅以EmEditor中的正则表达式来作介绍:

1. 启用正则表达式

菜单: Search – Find (Replace) – 选中 Use Regular Expressions

2. Emeditor 正则语法

正则表达式是普通字符和元字符组合的一种模式. 它的结构与算术表达式的结构类似, 各种元字符和运算符可以将小的表达式组合起来,创建大的表达式。通过在一对分隔符之间放置表达式模式的各种组件,就可以构建正则表达式。

2.1 普通字符

普通字符是指除了 “.”, “*”, “?”, “+”, “(“, “)”, “{“, “}”, “[", "]“, “^”, “$” 和 “\” 这些特殊字符之外的所有其他字符. 而这些特殊字符也可以通过前面加上”\”前缀而变为普通字符. 比如, 搜索”CCF”即为在文本中匹配所有的”CCF”字符串, 搜索”\[CCF\]“则是在文本中匹配所有的”[CCF]“字符串.

简而言之, 普通字符即为只匹配自身的字符.

2.2 元字符

元字符不匹配其自身,它用特殊方式来解析从而实现更多的逻辑功能。正则表达式通过元字符在模式中包含选择和循环

2.2.1 特殊字符

  • . 匹配除换行符 \n 之外的任何单个字符。
  • ( ) 分组捕获(子表达式)的开始和结束。可以捕获子表达式以供以后使用。
  • [ ] 中括号表达式的开始。
    中括号表达式是在方括号内包含一个或多个字符构成的列表的表达式。普通字符在中括号内表示本身,大多数特殊字符在中括号表达式内出现时失去它们的意义。除了转义字符’\', (要包含’\', 需要使用’\\’) 如: 正则表达式 No [1234] 匹配 No 1, No 2, No 3 和 No 4.

    如果想在中括号中使用一个范围作为列表来匹配字符,可以用连字符 ‘-’ 将范围中的开始字符和结束字符分开。单个字符的字符值确定范围内的相对顺序。如: 正则表达式 No [1-4] = No [1234]

    注意 1. 开始值的Unicode值必须在结束值Unicode值的前面。

    注意 2. [\-]匹配连字符’-', 放在中括号列表的开始或结尾也可起到同样的效果, 如 [-c-f] 匹配 c 至 f 的字符和连字符

    如果需要匹配不属于列表或范围内的任何字符,可以在列表开头加上’^'前缀。如: 正则表达式 No [^1-4] 匹配 No 5 和更大的编号.

    中括号表达式还可进行组合, 如 [A-Za-z0-9] 匹配A-Z, a-z, 0-9 的字符

  • \ 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,
    字符 n 匹配字符 n

    \n 匹配换行符

    序列 \\ 匹配 \

    序列 \( 匹配 (

  • | 替换字符, 对|左右的两个项分别匹配进行选择。或者说, 就是逻辑的OR的概念
  • { } 标记限定符表达式的开始。
    (数量)限定字符

    限定字符能够指定正则表达式的某个部分必须出现的次数

    • * 零次或多次匹配前面的字符或子表达式。如,c*f 可以匹配 f 和 ccf。* = {0,}
    • + 一次或多次匹配前面的字符或子表达式。如,c+f 可以匹配 cf 和 ccf,但不匹配 f。+ = {1,}
    • ? 零次或一次匹配前面的字符或子表达式。如,cc?f 可以匹配 cf 或 ccf。? = {0,1}
    • {n} n 是非负整数。正好匹配 n 次。如,c{2}f 可以匹配 ccf。
    • {n,} n 是非负整数。至少匹配 n 次。如,c{2,}f 不匹配 cf,而可以匹配 ccccccf。c{1,} = c+。c{0,} = c*
    • {n,m} m 和 n 是非负整数,其中 n <= m。至少匹配 n 次,至多匹配 m 次。如,c{1,3} 可以匹配 ccf 中的cc。c{0,1} 等效于 c?。

2.2.2 控制字符

  • \a Bell 字符。= 0×07
  • \f 换页符匹配。= 0×0C
  • \n 换行符匹配。= 0×0A
  • \r 匹配一个回车符。= 0×0D
  • \t 制表符匹配。= 0×09
  • \v 垂直制表符匹配。= 0×0B
  • \e ASCII 换码字符。= 0×1B
  • \0dd 八进制换码字符, dd代表八进制数字。
  • \xXXXX或\x{XXXX} 4位十六进制Unicode字符, XXXX代表十六进制数字。
  • \cZ Z-’@’ 控制字符Control-Z, Z为大于等与”@”的ASCII字符

2.2.3 换码字符

  • \w 任一单词字符, 如A-Z, a-z, 0-9, _等, 如 \w\w\w可以匹配 U_4 但不匹配 %^e
  • \W 任一非单词字符, 如 \W\W 可以匹配 *& 但不匹配 7#
  • \s 任一空白字符,包括空格、制表符、换页符、回车符和垂直制表符。= [ \f\n\r\t\v]
  • \S 任一非空白字符. = [^ \f\n\r\t\v]
  • \d 0-9的任一数字字符, 如 \d\d可以匹配 54 但不匹配 a4
  • \D 任一非数字字符. 如 \D\D可以匹配 a4 但不匹配 54
  • \l a-z 之间的任一小写字符, 如 \l\l\l可以匹配 ccf 但不匹配 ccF
  • \L 任一非小写字符, 如 \L\L\L可以匹配 CCF 但不匹配 cCF
  • \u a-z 之间的任一大写字符, 如 \u\u\u可以匹配 CCF 但不匹配 CCf
  • \U 任一非大写字符, 如 \U\U\U可以匹配 ccf 但不匹配 ccF
  • \C 任一字符, = ‘.’
  • \Q 前置引号符, 其后的任意字符均被认为普通字符直至出现后置引号符\E. 同时匹配单引号和双引号
  • \E 后置引号符

2.2.4 转义字符串

表示为[:classname:], 如”[[:space:]]”表示所有的空格字符

  • alnum 任一单词字符和数字字符. = [\w\d]
  • alpha 任何一个单词字符, 如A-Z, a-z, 0-9
  • blank 任一空白字符,包括空格、制表符、换页符、回车符和垂直制表符。= [ \f\n\r\t\v] = \s
  • cntrl 任一控制字符.
  • digit 0-9的任一数字字符, = \d
  • graph 任一图形字符.
  • lower a-z 之间的任一小写字符 =\l
  • print 任一可打印字符 = ‘.’ = \C
  • punct 任一标点符号
  • space 任一空格字符
  • upper a-z 之间的任一大写字符 = \u
  • xdigit 4位十六进制Unicode字符, = \xXXXX
  • word 任何一个单词字符, 如A-Z, a-z, 0-9, _等, = \w
  • unicode 任何一个ASCII值大于255的字符

2.2.5 定位字符

定位字符可以把正则表达式固定到行首或行尾。在Perl正则全集中还能使正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾, emeditor只是一个子集, 不包含这个功能。

  • ^ 匹配输入字符串开始的位置。如果设置customize中的”regular expressions can match new line characters”,那么 ^ 还匹配 \n 或 \r 后面的位置。 但在中括号表达式中使用的情况除外,在那种情况下它对字符集求反。
  • $ 匹配输入字符串结尾的位置。如果设置customize中的”regular expressions can match new line characters”,那么 $ 还匹配 \n 或 \r 前面的位置。

3. 分组捕获和替换

分组通常用来捕获特定模式的一组文本, 并用与之后的替换操作, 这也就是将分组和替换结合起来讲解的原因.

最基本的分组构造方式就是(),在左右括号中括起来的部分,就是一个分组;在正则全集中还有如(?<name> )的命名分组方式,这种方式组合了模式在就是对分组的部分进行了命名,这样就可以通过该组的命名来获取信息, 但这种方式在emeditor中不被支持. 以下分别来介绍各种不同的分组:

  • () 组捕获. 这种分组对模式在括号内所捕获的字符进行组合, 并且每个分组捕获的匹配结果都将保存为一个实体以备其后的操作所引用. 甚至在正则全集中还可对前面的分组进行反向引用(这是题外话, emeditor不支持). 举例说明:

    源文本:

    代码:
    site status- online members: 65, online guests: 12

    使用正则表达式:

    代码:
    (members|guests): \d+

    括号中有两个可能的匹配: members 和 guests, 只需要匹配其中任意一个; 其后是冒号和一个空格, 最后匹配至少一个数字. 匹配模式结果如下:

    代码:
    members: 65
    guests: 12

    其中members和guests在两次匹配中被捕捉, 可以在随后的操作中引用.

  • (? 非组捕获. 这种分组仅仅对模式在括号内所匹配的字符进行组合, 模式所匹配的字符将不会作为一个组来捕获. 虽然他也同样成为最终的匹配结果的一部分, 但无法为其后的操作所引用. 同样以上例继续:

    使用正则表达式:

    代码:
    (?:members|guests): \d+

    匹配模式结果同样为:

    代码:
    members: 65
    guests: 12

    但是members和guests仅仅在两次匹配中被分组, 并不被捕获, 也不可以在随后的操作中引用.

    使用非捕获组有其原因和场合. 其一, 从效率上说, 捕获一个分组需要消耗额外的资源和处理时间, 所以不应该捕获不需要使用的数据. 其二, 对模式中有多个捕获组的情况, 对不需要处理的分组进行捕获只会对分组信息造成混乱. 其三, 避免不需要贪婪匹配的场合发生贪婪匹配, 贪婪匹配是正则引擎的一个重要特性, 要说清楚其机理可能还需要另外开一个专题了. 对这一点, 还以上例说明一下:

    使用不带分组的正则表达式:

    代码:
    members|guests: \d+

    匹配模式为:

    代码:
    members
    guests: 12

    这个正则表达式的问题在于, 他匹配的是”members” 或 “guests: \d+”, 这是模式中贪婪”消费”字符引起的. 而通过增加括号进行分组, 使正则引擎将两个匹配选项作为一个组处理, 从而正确匹配其中的一个匹配项.

  • (?=) 正声明组, 非捕获. 此分组中的模式必须出现在声明的右侧, 并且, 这个模式不构成匹配结果的一部分. 举例:

    源文本:

    代码:
    site status- online members: 65, online guests: 12

    使用正则表达式:

    代码:
    \S+(?=\s\d+)

    此模式中规定了\s\d+必须出现在\S+声明的右侧. 也就是说, 在至少一个非空格字符(声明)的右侧必须出现一个空格字符和至少一个数字, 而且只有这个声明构成匹配结果. 匹配模式结果如下:

    代码:
    members:
    guests:

    这两次匹配中不被捕捉.

  • (?!) 负声明组, 非捕获. 此分组中的模式不得出现在声明的右侧, 并且, 这个模式不构成匹配结果的一部分. 还是用上面的例子:

    使用正则表达式:

    代码:
    \d{2}(?!,)

    此模式中规定了”,”不得出现在\d{2}声明的右侧. 也就是说, 在连续两个数字(声明)的右侧不得出现逗号才能被匹配. 匹配模式结果如下:

    代码:
    12

    这两次匹配中不被捕捉.

严格的说, 后面两个分组不能称之为分组, 他们只是模式声明, 他们不能成为匹配结果, 也不能被捕获. 在正则全集中, 还有反向声明分组(?<=)(?), 在emeditor中不被支持.

说到括号的功能, 本来正则中的一个重要指令-条件指令和分组内联设定是不得不说的, 可惜的是… emeditor也同样不支持~~~~

在前面的例子中一直提到匹配之后的操作, 而这个进一步的操作最常见的就是替换. 先继续上面的例子:

源文本:

代码:
site status- online members: 65, online guests: 12

使用搜索正则表达式:

代码:
(members|guests)

和替换正则表达式:

代码:
ccf-\1

匹配模式结果如下:

代码:
members
guests

替换后的文本为:

代码:
site status- online ccf-members: 65, online ccf-guests: 12

其中members和guests在两次匹配中被捕捉, 在随后被引用, 并添加ccf-前缀后替换源文本中的匹配字符.

在匹配模式中的分组匹配结果将按前后顺序被正则引擎分别赋予内部组号, 在替换操作中就可以用\加上这个组号来引用相应的匹配结果. 继续上例:

使用搜索正则表达式:

代码:
(members|guests): (\d{2})

和替换正则表达式:

代码:
ccf-\1 = \2

匹配模式结果如下:

代码:
members: 65
guests: 12

替换后的文本为:

代码:
site status- online ccf-members = 65, online ccf-guests = 12

在emeditor的正则子集中增加了一个特殊的引用: \0 , \0 将引用上次的匹配结果, 继续把:

使用搜索正则表达式:

代码:
\d{2}

和替换正则表达式:

代码:
*\0*

匹配模式结果如下:

代码:
65
12

替换后的文本为:

代码:
site status- online ccf-members: *65*, online ccf-guests: *12*

作为一个编辑软件, emeditor的正则子集中增加了一些替换修饰符:

  • \U 大写修饰. 将其后的所有的字符替换为大写
  • \L 小写修饰. 将其后的所有的字符替换为小写
  • \H 半角修饰. 将其后的所有的字符替换为半角字符. 写到这里, 不得不称许一下emeditor对中文的良好支持, 这个\H至少我是很常用的, 不喜欢看到文本里面都是些123abc之类的全角字符…
  • \F 全角修饰. 将其后的所有的字符替换为全角字符
  • \E 关闭之前的\U, \L, \H, \F修饰.

Grep书签

Grep是终端下一款好用的正则表达式工具,其全名是lobal search regular expression(RE) and print out the line,它最直接的功能是搜索具有指定正则表达式模式的文本文件。当然还可以在不同的场合下有不同的功用。例如,在ubuntu下,我经常使用类似于这样的命令(在windows下,搜索NTFS分区中的文件,我使用Everything,它是速度最快的文件搜索软件,不过只搜索文件名,不搜索文件内容,支持正则表达式):

find | grep -E ‘(mp3|wma)$’

该命令的作用是,以递归的方式寻找当前目录下所有的mp3、wma文件,打印出完整的路径。之所以不用ls,是因为ls不能显示完整路径。之所以在grep后面加”-E”,是为了使用更完整的正则表达式的支持。

我推荐的关于GREP的链接如下:
Read the rest of this entry »

RegexBuddy3.2.1完全版

感谢网友WNlord提供信息,我有幸下载到了RegexBuddy当前的最新版3.2.1。该版本是零售完全版,可以做生成Portable Installation。不知道RegexBuddy功能的请自行站内搜索。下载地址见文章末尾。
Read the rest of this entry »

正则式软件中的TotalCMD:RegexBuddy

regexbuddy 3.2.0

之前我爱正则表达式已经介绍过,RegexBuddy 是windows下(在linux下可以使用wine调用)一款超强的正则式辅助编写软件。在它的帮助下,你可以轻松编写你所需要的正则表达式,清晰地理解别人写的正则表达式,快速测试正则式与目标文本或文件是否匹配并避免出现错误。它能帮你把正则表达式转换成你所需要的编程语言的格式,帮你收集并详细记录正则式代码库,以便将来重新使用。它还能与你最喜欢的搜索工具、编辑器集成在一起,招之即来。在我所有使用过的正则式软件中,以RegexBuddy为最强,称之为正则式软件中的TotalCMD,毫不为过。

原来本站以留言索取的形式,向诸位同好提供过3.1.0版。在网友那个谁的协助下,我得到了更新一点的版本,3.2.0,附在文末,请按需下载。

Read the rest of this entry »

PowerGREP3.50完全版下载

之前我爱正则表达式介绍过一款软件PowerGREP,并以留言索取的形式,向大家发放3.3.3版。今天,在热心网友astek的推荐下,rex下载到了PowerGREP的3.50版,这也是迄今为止的最新版。下载地址见文末。

PowerGREP是一款正则式应用软件,它是grep或egrep的增强版,允许您以直观可视、可撤消的方式,在不同的文件夹内,对不同的文件进行批量的文本搜索、替换。当然,是正则表达式层面上的。详细的介绍可参考这篇文章:windows下的正则式工具介绍之二:powergrep。该篇文章的评论功能已经关闭,如果对该软件有问题,可以在此留言,或集中至正则式中文论坛http://regex.me讨论。

Read the rest of this entry »

Windows下的正则表达式工具之五——经典的Regulator

本文介绍的the Regulator 2.0 与上一篇文章介绍的Expresso一样,都是颇有年头的软件:Expresso的最后更新日期似乎是2007年6月30日;the Regulator 2.0的上次更新,更是可追溯到2004年。可是,在没有RegexBuddy的日子里,the Regulator 可算是元老呢!MSDN上有篇文章《Ten Must-Have Tools Every Developer Should Download Now》,介绍了开发者必备的10款工具之一就有the Regulator。作者Roy Osherove在regulator的帮助文件中说,自己的Regulator的创意就来自于Expresso

Regulator的界面,比Expresso要新潮,与以前介绍过的Mtracer有几分相像。 Read the rest of this entry »

Windows下的正则表达式工具之四——强大而免费的Expresso

Expresso|http://iregex.org|我爱正则表达式 曾经沧海难为水,除却巫山不是云。用过了RegexBuddy,再用其它的正则式辅助软件,总有些不习惯。然而本人幸好不是固步自封之辈,任何时候都勇于尝试新工具,体验新特征。这不,最近知道了Expresso,第一时间就想体验一把,将感受写在这里。

Read the rest of this entry »

windows下的正则式工具介绍之三:MTracer2.0介绍以及与RegexBuddy比较

RegexBuddy和PowerGrep是我在windows下常用的两款正则式工具。前者是帮助编写正则式的辅助工具,后者是进行批量搜索替换的实用工具。这两款软件都是外国人写的。今天介绍国人史寿伟先生写的一款正则式工具,MTracer 2.0。

Read the rest of this entry »

如狐添翼:FireFox3正则表达式搜索插件/Find Bar/

原来在FireFox2.x中使用过一个插件FindBar,十分好用。升级到firefox3.0之后,FB居然冬眠。今天终于看到更新,能继续在firefox中使用了,心情超爽,特写日志以记之。
Read the rest of this entry »

windows下的正则式工具介绍之二:powergrep

上文介绍了RegexBuddy,本文介绍另一款windows下的正则式软件:PowerGREP,号称“The Most Powerful GREP Tool for Windows”,windows下最强大的GREP工具。看清楚了,是最强大,而非之一。与RegexBuddy一样,也是商业软件,其售价为US$149.00,合人民币1000有奇。如果说RegexBuddy是撰写正则式的贴心助手,那么PowerGREP则是应用正则式在文本文件中搜索替换的强大工具。现在我们看看,它究竟有什么功能敢号称最强

基本界面

点击可以看大图。另外,还有一组图片来自powergrep官网,附上了官网的部分介绍,以及个人评论。

  • 内容搜索图片,点这里
    在本抓图中,我搜索了c:\My Documents\My Web Sites文件夹及其子目录下所有的html文件。我使用了一条正则表达式把搜索范围限定在HTML tag之内,使用另一条正则式在这些标记中搜索所有的email地址。

  • 搜索和替换,点这里这里
    一个好用的功能是可以预览结果而不是立即替换。匹配结果以黄色标出。双击匹配就能打开对应的文档并检验其内容。
    点击执行后,颜色改变,表示已经实施替换。

  • 收集信息和统计数据,点这里
    本例是“检测Apache网络日志--google search terms”的例子。本例使用的正则式在PowerGREP帮助文档中有详细讲解。

  • 灵活的“撤消”历史记录,让你不再抓狂,点这里
    在执行替换的同时,PowerGREP已经备份了原文件。只要你没有手动删除这些备份的文件,你可以随便撤消你做过的任何操作。世界上真有后悔药的呀。

  • 搜索PDF文档,点这里
    PDF也能使用正则式进行搜索?当然了,你没有看错。只是,要确保PDF文档中你要搜索的内容是文字而非图像。也就是说,扫描版的PDF不享受此功能的哟。

  • 在MS word 文档中搜索,点这里
    这个功能也十分有用。我记得还有个东东叫ViEmu for Word & Outlook,可以在word和outlook中模拟vim,当然可以使用正则式搜索替换了。不过,ViEmu一来也是收费软件(在2008年5月31日之前是79美刀,之后是99美刀),我还没有找到免费版本;二来其正则式是vim风格的,只习惯Perl风格的同学可能不太习惯。在google documents里也支持正则式搜索了,具体语法、风格尚未广泛测试。

  • 在MS Excel中搜索,点这里
    同样也是批量搜索、替换。不单单是对一个文档、一个sheet。

  • 以16进制模式,在2进制文档中搜索,点这里
    跟二进制编辑器界面类似,多了正则式批量搜索替换功能。

  • 在zip压缩文档中搜索,点这里
    把zip文件当作普通文件夹来搜索。很强大吧?

  • 正则表达式序列,点这里
    大多数正则式工具一次只支持一条正则式的操作。而PowerGREP可以一次执行多条正则式!使用checkbox来进行多项选择。

  • 定制颜色显示,点这里
    该功能比较一般。除非软件中的颜色设置特傻,一般我是不会改变默认颜色搭配的。

功能演示

PowerGREP官网还提供了一组flash做的demo,见下。

  • 使用正则式匹配email地址(2′47”)。点这里
  • 升级版权信息(3′38)。点这里
  • 与RegexBuddy的无缝链接(1′57”),点这里;两个软件是亲兄弟,当然哥俩好啦!
  • 文件选择(3′08”),点这里;PowerGREP提供了贴心的特性,来帮助你筛选需要的文档。
  • 其它特性(8′37”),点这里;总而言之,PowerGREP是功能强大。自己发掘吧!

软件下载

目前其最新版为3.4.2,更新于2008年1月18日。其官网为www.powergrep.com,可以去下载其最新版试用。该软件为商业软件

  • 如果你偶然路过,尝新而已,那只需下载试用版即可;
  • 如果你觉得好用、准备常用、手有余钱、非正版不用,不妨花美金购买;要花人民币1000多块哟^_^
  • 如果你喜欢它,同时你认为优秀的网络资源是应该和朋友免费分享的,从而想获得该软件的全功能免费版,好吧,我也成全你,请在本文后留言(附邮箱),我会把这个小东西的链接发给你(最新版为3.4.2,我手头的全功能版为3.3.3,也足够用了)。更新:
    请移步至此下载PowerGREP 3.5.0版。

———————————————————————————————————

windows下的正则式工具介绍之一:RegexBuddy

RegexBuddy

俗话说,工欲善其事,必先利其器。关于windows下的正则表达式工具,这里推荐的是:RegexBuddy和PowerGREP。在linux下,也有好用的正则表达式工具,例如grep的兄弟们,只不过是都是基于命令行的。而这两款windows下的小工具,其突出特点是可视化,允许尝试和预览,极大地方便了使用者。

RegexBuddy:网址是http://www.regexbuddy.com。在编写正则式时,它提供可视化的支持、提示、调试方面的便利;在使用正则表达式时,它无私地将正则式转换为多种语言的字串,还提供了代码输出功能。正则式助手,该称号名副其实。

基本界面

正则式的基本功能无外乎搜索和替换。在本文中,我们使用匹配Email的正则式,代码如下:

\b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b

此时,RegexBuddy的界面如图:

regex001

在点击“Explain Token”时,能对当前的正则式片断的作用作出详细解释,例如当你把光标移动到\b上再点击Explain Token,就会激活帮助文档,自动定位到Word Boundaries这一段。

如果想对刚才编写的这条正则式进行测试和验证,可以点击“Test”进行测试。这时,在下边的文本框输入所需要匹配测试的文字,例如dog@animals.com,匹配结果就以黄色背景色标出。在本例中,你或许没有得到正确的匹配,呵呵,那是正常的。为什么?答案见文章结尾。

regex002

拷贝粘贴

RegexBuddy能把正则式以多种字符串格式拷贝出来。还是刚才那条正则式,根据需要,它可以被拷贝为:

'\\b[A-Z0-9._%-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b'
"\\b[A-Z0-9._%-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b"
'/\\b[A-Z0-9._%-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b/i'

具体的选项在copy菜单里,如下图所示。你不必为单双引号、正反斜线操心了。

regex004_menu

在paste菜单项中也有类似应用,不赘述。

正则式->代码

如果你想把刚才编写好的正则式应用在程序中,这里还有一个选项:Use,界面见下图:

regex004_use

在上面的match和replace之间点击,其代码也相应自动调整;当选取不同的language时,代码也会相应调整。它支持的语言格式为:

  • C#
  • Delphi(NET/Win32)
  • Java/JavaScript/ECMAScript
  • PCRE
  • PHP
  • Perl
  • Python
  • RealBasic
  • Ruby
  • VB

另外,它还有function选项,分别用以实现下述功能:

  • If/else branch whethe the regex matches (part of) a string. If/else验证正则式是否匹配字串(的一部分)。 最常用的功能。
  • If/else branch whethe the regex matches a string entirely. If/else验证正则式是否匹配整条字串。
  • Get the part of a string matched by the regex. 取得字串中与正则式匹配的部分。Get the part of a string matched by a capturing group. 取得字串中所匹配的捕获组。这一条我也是刚刚知道,很有用哟。
  • Get an array of all regex matches in a string.将字串中所有的匹配保存到数组中。
  • Iterate over all matches in a string。列出字串中所有的匹配项。(例如,在使用正则式’\w’来匹配字串’abc’时,本function列出的内容为’a',’b',’c’.)。单词iterate的含义是重复
  • Comment with RegexBuddy’s regex tree. RegexBuddy的正则树的注释。

文本分割split

如果需要处理的文本是以某种分隔符隔开的,而该种分隔符恰好又能使用正则式描述,(例如html标签),此时regexbuddy的split功能就可以大显身手了。我随便打开了一个饭否网页,对其源代码中的消息部分(<div id=“stream”>与</div>之内)的文本进行了处理,使用如下正则式删除了所有的尖括号内容,只留下普通文本。

使用的正则式为:

<[^>]+>

软件界面以及运行结果请见下图。



结尾:

关于本文开头提出的小问题,细心的你或许一下子就能看出答案了!见下图:

regex003

只要选中Case insensitive选项中OK啦!如果你没有找到,或许是因为该软件是英文的,一时间您没有注意到该选项;或者您对正则式还不太熟悉。

软件下载

上文已经提到,其官网为www.regexbuddy.com,可以去下载其最新版试用。该软件为商业软件

  • 如果你偶然路过,尝新而已,那只需下载试用版即可;
  • 如果你觉得好用、准备常用、手有余钱、非正版不用,不妨花美金购买
  • 如果你喜欢它,同时你认为优秀的网络资源是应该和朋友免费分享的,从而想获得该软件的全功能免费版,好吧,我也成全你,请在本文后留言(附邮箱),我会把这个小东西的链接发给你(最新版为3.1.1,我手头的全功能版为3.1.0,也足够用了)。

下篇文章将要介绍另一款regex工具:PowerGREP,敬请期待。

本文为rex.zhasm原创,原文地址在http://iregex.org/blog/y2008/m04/d30/regexbuddyregexbuddy.html,可以在遵循CC协议的条件下转载。

————————————-
2008.12.26 更新:
本文已经关闭评论,即将发布3.2.0完全版。不会晚于2008.12.28。敬请期待。
2008.12.28 更新:
请移步至此下载RegexBuddy 3.2.0版。