深柳堂

  • Tag:
    标签集合
  • Suggest:

WordPress 更新到2.6.5 停掉了UTW这一伟大的插件...

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

September 16th, 2008

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

 

MTracer 2.0软件版本

MTracer2.0全名是RegexMatchTracer,官方主页在regexlab.com。上面说最近更新日期是2007.10.07,不过,从我今天下载的程序的修改日期来看,是2008.09.13。变化是,之前作者提供的是绿色的程序,现在提供的是msi的安装包。 本文以下提到MTracer时,若无特殊说明,均指MTracer2.0。

 

MTracer软件特性

作为一款正则表达式撰写辅助程序,它拥有查找匹配、替换模式、分割模式,可以分别进行相应操作。前两种用的比较多,各种语言或正则式工具都有相应语句或函数来实现;第三种分割模式是指使用正则表达式来描述字符串的分割符,以便将字串分割成子串数组。举个简单的例子来说,可以使用正则式\d+;?abcd12;sdf55656asdfasd82asd33x字串分割成子串数组:

  • abcd
  • sdf
  • asdfasd
  • asd
  • x

在实际操作时,你总会遇到使用分割模式才能最有效率地解决的问题。

除了一般的选项(忽略大小写、单行\多行、全局),它提供了从右向左、扩展模式两种匹配选项。

从右向左:平时查找字串最右边的正则式匹配,可以借助于?$来定位。而在MTracer下,这款比较令人耳目一新的选项十分好玩,虽然我还没有在实际操作时遇到过确需此选项的例子。

扩展模式:包括如下选项:

  • 注释 (?#xxx):在正则式中加入注释以便提高可读性;
  • 模式修改符 (?ismg-ismg):小范围内修改匹配模式;
  • 非捕获组 (?:xxx):匹配而不捕获,便于计数,同时还可以节省内存,提高效率(根据《精通正则表达式》的说法);
  • 预搜索(零宽度断言):十分有用的匹配选项,只匹配位置,而不消耗字符;有四种模式,详见手册
  • 独立表达式 (?>pattern):此选项在《精通正则表达式》中,被余晟先生翻译为“固化分组”,即无论匹配成功与否,内部都不进行回退,都不会再次尝试匹配;
  • 条件表达式(?(x)y|z):与C语言的三目操作符类似,x条件为真则进行y匹配,否则进行z匹配。其中x部分有四种模式,详见手册
  • 递归表达式 (?R):对另一部分子表达式的引用,而不是对其匹配结果的引用。当被引用的表达式包含自身,则形成递归引用。

个人比较常用的选项是非捕获组和预搜索。

 

MTracer最有用的特性

相对于另一款正则式撰写辅助程序RegexBuddy而言,MTracer最有用的特性是中文的正则式分析树。虽然RegexBuddy也有此功能,但是MTracer的正则式分析树是中文的。这对于需要此功能但是不愿意使用英文软件的用户来说非常方便。对于初学者也很有帮助。

值得说明的是,正则式的中文术语在中文里还没有形成统一的规范。以我自身的阅读经历而言,似可分为两类:何伟平译的《Perl Programming》第三版中大量使用的正则式术语译法为第一套方案,余晟先生译的《精通正则表达式》第三版中使用的正则表达式为第二套。个人倾向于第二套。

MTracer使用的正则表达式术语,与这两套术语均有相异之处。

如果有人使用上述第二套术语将RegexBuddy汉化的话,估计在中国的普及率会大幅提高。题外话。

 

 

与RegexBuddy的简单比较

还是列表说明吧。

属性 MTracer RegexBuddy
界面语言 中文 英文
大小 471kb 9.1 MB
价格(单用户) 个人RMB49.00

公司RMB298.00
US$ 39.95
免费版的限制 正则式长度限制 7天免费使用时间
帮助文件 原来版本有,最新的msi版已经不带帮助文件;需要的话可以下载本站上传的手册 齐全。包括4本电子书,其中3本是关于正则表达式的教程、参考手册,1本是RegexBuddy的操作手册。十分翔实。语言是英文。
匹配模式
  1. 匹配
  2. 替换
  3. 分割
  1. 匹配
  2. 替换
  3. 分割
匹配选项
  1. 忽略大小写(开关)
  2. 单行、多行
  3. 全局局部可选
  4. 从右至左
  5. 扩展模式(详见上文)
  1. 忽略大小写 (开关)
  2. 单行、多行
  3. 默认全局
  4. 点号匹配新行
  5. ^$匹配换行符
  6. 空白字符宽松模式
  7. 扩展模式(依语言而定)
历史功能 “文本片断”即是 History
导出字串为指定语言
  1. 原状导出
  2. Visual Basic
  3. C/C++
  1. 原状导出
  2. C/C#
  3. Perl(m//或s///格式)
  4. Basic
  5. Java
  6. JavaScript
  7. Pascal
  8. PHP (//)
  9. PostgreSQL
  10. Python
  11. Ruby
  12. SQL
  13. Tcl
  14. XML
  15. 还包含在上述语言中如何调用该正则式的模块,功能强大、有用、好用。(Use)
常用正则库 帮助文件中有提及 程序中包含该功能,有定义、例代码、匹配实例。

帮助文件中也有。
扩展性 支持插件(疑安装目录下的stdplgin.dll是其插件,功能不详。) 与PowerGrep相关联。
帮助论坛 开放,地址在此 仅对付费注册软件的用户开放。
界面高度可定制 不支持 支持
是否支持批量替换外部文件 不支持 支持

当然,没有提到的功能、细节还不少,这里仅仅是列出本人关注的属性。

 

MTracer 2.0注册

付出劳动,换来报酬,是当今任何行业都认可的规则。MTracer需要注册费,这一点也十分正常。其价格是48元人民币。比起US$ 39.95的RegexBuddy来,可谓性价比极高。

如果不注册,会有什么限制呢?请看图。哦,是有100个字符的限制。

这是注册后的图。

对于未注册版本,平时写一些短小的正则式,是没有问题的。如果想无限制地使用该程序,花48元支持一下国产程序,何乐而不为?

现在无论主动还是被动,版权意识都在深入人心。这也是本人一直没有把完全版的RegexBuddy和PowerGrep的下载链接贴到blog上、而是采取来Email索取的原因之一。

MTracer2.0采用注册号的方式注册。看来作者深知在国内破解成风,于是很幽默地添加了这样一则菜单选项:如何8小时破解本软件?呵呵。8小时我们可以做许多事情,没有必要浪费在track、debug、crack上。你的时间很值钱的。

这两款软件的完全版我这里都有,如果需要RegexBuddy的话,请占击链接留下信箱索取即可;但是MTracer的话就不要索取了。

 

相关阅读

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

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

探索匹配中文的正则表达式

August 24th, 2008

按:本文使用的RegexBuddy为3.1.0(完全)版,并非最新版3.1.1(截至2008.08.23)。需要该版本的请在这篇文章后留言。

注:参考www.regular-expressions.info的风格,更新了本模板的style.css文件,加入了与正则式代码相关的格式:

  • 正则式格式举例:[a-z]+@[a-z]+?\.[a-z]+
  • 匹配格式举例:pig@animals.comchicken@birds.com
  • 普通文本格式举例:这是一些普通文本。hello regex world. pig@animals.com和chicken@birds.com

可以这样使用:在字符串这是一些普通文本。hello regex world. pig@animals.com和chicken@birds.com使用正则式[a-z]+@[a-z]+?\.[a-z]+加以匹配,得到的结果为:pig@animals.comchicken@birds.com

极端粗放型:点号其实是近乎万能的,可以匹配任何字符,限制只在于换行符的匹配上。匹配中文自然不在话下。作为可有可无的背景符,一个.*就能匹配掉包括中文在内的全部字符。这当然是一种极端的情况,因为这样显示不出中文字符串的特性。这不是本文要探讨的。

极端集约型:如果搜索特定文本,例如在一二三四五六七八九十拾佰百千仟万亿中匹配十拾, 直接使用m/十拾/就能搞定。这同样不是本文要探讨的。与\w能匹配英文字母一样,本文想找的是能够匹配所有汉字,而不匹配其它文本的一种简写方式。

普适型型:由于汉字属于Unicode,我们就从unicode里面找。在Unicode Regular Expressions,列出了unicode的许多种表达方式。搜索chinese,找到如下一行:

Writing Systems Blocks
Chinese CJK Unified Ideographs, CJK Unified Ideographs Extension A, CJK Compatibility Ideographs, CJK Compatibility Forms, Enclosed CJK Letters and Months, Small Form Variants, Bopomofo, Bopomofo Extended

关于CJK的含义,是指中日韩统一表意文字(Chinese Japanese Korean Unified Ideographs),可以参考百度释义,或wiki词条。

再查了一下regular expressions,查到其unicode一节有这样的内容:

\p{InCJK_Unified_Ideographs}: U+4E00..U+9FFF

看到这里,我想起了以前写的《匹配用户名的asp正则表达式(包括中文)》一文中,提到的中文匹配为[\u4e00-\u9fa5],原来是有其对应的速记方式的,虽然两者有最后一组字符的差异。看附图可见U+9fa5,最后一个汉字的模样。我爱正则表达式|在RegexBuddy中如何使用正则表达式匹配中文字符|http://iregex.org 此序列的第一位,U+4e00,是汉字

自定义:到目前为止,相当于给汉字找到了官方的身份和说法,使用\p{InCJK_Unified_Ideographs}就能匹配所有的中文字符。我们其实也可以将一些重复出现的东西,封装起来,以备使用。例如,对于阿拉伯数字,我们有\d可以用。对于中文数字一二三四等等,我们有没有办法呢?

$zh_digit=qr/一|二|三|四|五|六|七|八|九|十|零|〇|百|千|万|亿|佰|仟|壹|贰|叁|肆|伍|陆|柒|捌|玖|拾/;
 
$str="人民币五十一万零三百元整。大写:伍拾壹万零三佰元整。";
while($str =~ s/((?:$zh_digit)+)//)
{
	print $1."\n";
}

我爱正则表达式|在RegexBuddy中如何使用正则表达式匹配中文字符|http://iregex.org

其输出结果见附图。

结论

可以使用\p{InCJK_Unified_Ideographs}匹配任意中文字符。在不支持该种标记方式时,也可以使用[\u4e00-\u9fa5]加以匹配。

关于文正则表达式,我觉得尚未穷其奥秘。以前在linux(utf8编码)下,编写scim输入平台的郑码码表时,匹配中文所使用的正则表达式为[\x80-\xff]{3},也能很好地工作。请参阅此文:龙文郑码码表 for scim。其原理我尚不清楚,留待之后有时间研究。如有知情者,也请不吝赐教,先行谢过。

匹配用户名的asp正则表达式(包括中文)

July 13th, 2008

有人在正则表达式中文站贴出这样一道问题:

求ASP 用户名 表达式

用户名长度在2-20字符之间,由中文/大小写字母/数字/中划线-/下线线_组成。

这个问题不算难,只要下边一行核心代码就能搞定:

"^[-_a-zA-Z0-9\u4e00-\u9fa5]{2,20}$"

关键是没有使用过ASP语言。按此页的提示,设置了ASP环境。查询了一些在线的入门级ASP教程之后,解答如下:

 
<form action="verify.asp" method="post">
姓名:
<input name="name" type="text" />
 
<input name="Submit" type="submit" value="提交" />
<input name="Submit2" type="reset" value="重置" />
</form>

它调用以下verify.asp文件:

&lt;%
Function RegExpTest(patrn, strng)
Dim regEx, retVal ' 建立变量。
Set regEx = New RegExp ' 建立正则表达式。
regEx.Pattern = patrn ' 设置模式。
regEx.IgnoreCase = False ' 设置是否区分大小写。
retVal = regEx.Test(strng) ' 执行搜索测试。
If retVal Then
RegExpTest = "合法用户名。"
Else
RegExpTest = "非法用户名。"
End If
End Function
 
name=request.form("name")
psw=request.form("psw")
sex=request.form("sex")
city=request.form("city")
Response.write RegExpTest("^[-_a-zA-Z0-9\u4e00-\u9fa5]{2,20}$", name)
%&gt;

运行界面见附图。

另外,还有一些正则表达式可供参考:

匹配中文字符的正则表达式

[\u4e00-\u9fa5]

匹配双字节字符(包括汉字在内)正则表达式

[^\x00-\xff]

匹配空行的正则表达式

\n[\s|   ]*\r

匹配HTML标记的正则表达式

/ &lt;(.*)&gt; .* &lt;\/\1&gt; | &lt;(.*)   \/&gt; /

匹配首尾空格的正则表达式

(^\s*)|(\s*$)

正则表达式限制只能输入中文:

onkeyup= "value=value.replace(/[^\u4E00-\u9FA5]/g, ' ') "   onbeforepaste= "clipboardData.setData( 'text ',clipboardData.getData( 'text ').replace(/[^\u4E00-\u9FA5]/g, ' ')) "

正则表达式限制只能输入全角字符:

onkeyup= "value=value.replace(/[^\uFF00-\uFFFF]/g, ' ') "   onbeforepaste= "clipboardData.setData( 'text ',clipboardData.getData( 'text ').replace(/[^\uFF00-\uFFFF]/g, ' ')) "

正则表达式限制只能输入数字:

onkeyup= "value=value.replace(/[^\d]/g, ' ')   "onbeforepaste= "clipboardData.setData( 'text ',clipboardData.getData( 'text ').replace(/[^\d]/g, ' ')) "

正则表达式限制只能输入数字和英文:

onkeyup= "value=value.replace(/[\W]/g, ' ')   "onbeforepaste= "clipboardData.setData( 'text ',clipboardData.getData( 'text ').replace(/[^\d]/g, ' ')) "

匹配中文的正则表达式

June 2nd, 2008

以前在编写linux下的scim郑码码表时,就跟正则式的中文匹配问题打过交道。当时总结了这样一条经验,utf8编码格式下,中文正则式应该这样书写:

[\x80-\xff]{3}

当然,这与语言无关。在perl与python中,都是一样的。

现在,这条正则式又派上用场了。正在编写的一个小程序MiniBlogs Updater中,需要计算用户所输入的文字字数。因为中英文字符编码长度不一,如果直接使用python中的len()函数,它计算的是该字串的实际长度,一个中文字并非等同于一个英文字母的。因此,需要把中文字当成英文字母来处理。

我写了这样一条语句来处理:

?View Code PYTHON
length=len(re.sub('[\x80-\xff]{3}','a',msg))

它的意思是,把所有的中文都替换成英文字母a,然后再统计字数。(只是统计而已,不修改源字串。)这条语句在windows下utf8文件中能够正常工作。

再分享两则与匹配中文的正则表达式有用的链接: